From e6cb1369da5fcc61e3126d7c94f4cfed275c3a35 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sat, 22 Jul 2017 23:15:36 +0200 Subject: [PATCH] build beta4 (#4123) --- CHANGELOG.md | 17 + HEADER.js | 2 +- dist/fabric.js | 1287 ++++++++++++++++++++++++++-------------- dist/fabric.min.js | 18 +- dist/fabric.min.js.gz | Bin 75119 -> 76154 bytes dist/fabric.require.js | 837 ++++++++++++++++---------- package.json | 2 +- 7 files changed, 1386 insertions(+), 777 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03839aa0..16821d0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,23 @@ - Added Text.cleanStyle, Text.removeStyle [#4060](https://github.com/kangax/fabric.js/pull/4060) - change: lockRotation will not hide the mtr control anymore. introduced notAllowedCursor for canvas. [#4064](https://github.com/kangax/fabric.js/pull/4064) - improvement: added 2 percentage values to fabric.util.animate. [#4068](https://github.com/kangax/fabric.js/pull/4068) +- change: pathOffset does not get exported anymore in path.toObject, toDatalessObject export sourcePath instead of modifying path. [#4108](https://github.com/kangax/fabric.js/pull/4108) + +**Version 1.7.17** +- Change: swapped style white-space:nowrap with attribute wrap="off" since the style rule was creating problems in browsers like ie11 and safari. [#4119](https://github.com/kangax/fabric.js/pull/4119) +- Fix: Remove an object from activeGroup if removed from canvas [#4120](https://github.com/kangax/fabric.js/pull/4120) +- Fix: avoid bringFroward, sendBackwards to swap objects in active selections [#4119](https://github.com/kangax/fabric.js/pull/4119) +- Fix: avoid disposing canvas on mouse event to throw error [#4119](https://github.com/kangax/fabric.js/pull/4119) +- Fix: make svg respect white spaces [#4119](https://github.com/kangax/fabric.js/pull/4119) +- Fix: avoid exporting bgImage and overlayImage if excludeFromExport = true [#4119](https://github.com/kangax/fabric.js/pull/4119) +- Fix: Avoid group fromObject mutating original data [#4111](https://github.com/kangax/fabric.js/pull/4111) + +**Version 1.7.16** +- improvement: added 2 percentage values to fabric.util.animate. [#4068](https://github.com/kangax/fabric.js/pull/4068) +- Improvement: avoid multiplying identity matrices in calcTransformMatrix function +- Fix: ativeGroup did not destroy correctly if a toObject was happening +- Improvement: Pass the event to object:modified when available. [#4061](https://github.com/kangax/fabric.js/pull/4061) + **Version 1.7.15** diff --git a/HEADER.js b/HEADER.js index 464f2d90..8bdf6805 100644 --- a/HEADER.js +++ b/HEADER.js @@ -1,6 +1,6 @@ /*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: '2.0.0-beta3' }; +var fabric = fabric || { version: '2.0.0-beta4' }; if (typeof exports !== 'undefined') { exports.fabric = fabric; } diff --git a/dist/fabric.js b/dist/fabric.js index 0c42b3ce..050cf443 100644 --- a/dist/fabric.js +++ b/dist/fabric.js @@ -1,7 +1,7 @@ /* build: `node build.js modules=ALL exclude=json,gestures,accessors minifier=uglifyjs` */ /*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: '2.0.0-beta3' }; +var fabric = fabric || { version: '2.0.0-beta4' }; if (typeof exports !== 'undefined') { exports.fabric = fabric; } @@ -285,7 +285,7 @@ fabric.Collection = { this._onObjectAdded(arguments[i]); } } - this.renderOnAddRemove && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, @@ -307,7 +307,7 @@ fabric.Collection = { objects.splice(index, 0, object); } this._onObjectAdded && this._onObjectAdded(object); - this.renderOnAddRemove && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, @@ -332,7 +332,7 @@ fabric.Collection = { } } - this.renderOnAddRemove && somethingRemoved && this.renderAll(); + this.renderOnAddRemove && somethingRemoved && this.requestRenderAll(); return this; }, @@ -1029,6 +1029,7 @@ fabric.CommonMethods = { /** * @static * @memberOf fabric.util + * @deprecated since 2.0.0 * @param {fabric.Object} receiver Object implementing `clipTo` method * @param {CanvasRenderingContext2D} ctx Context to clip */ @@ -1962,17 +1963,20 @@ fabric.CommonMethods = { /** @ignore */ addListener = function (element, eventName, handler, options) { // since ie10 or ie9 can use addEventListener but they do not support options, i need to check - element.addEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); + element && element.addEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); }; /** @ignore */ removeListener = function (element, eventName, handler, options) { - element.removeEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); + element && element.removeEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); }; } else if (shouldUseAttachEventDetachEvent) { /** @ignore */ addListener = function (element, eventName, handler) { + if (!element) { + return; + } var uid = getUniqueId(element); setElement(uid, element); if (!listeners[uid]) { @@ -1988,6 +1992,9 @@ fabric.CommonMethods = { }; /** @ignore */ removeListener = function (element, eventName, handler) { + if (!element) { + return; + } var uid = getUniqueId(element), listener; if (listeners[uid] && listeners[uid][eventName]) { for (var i = 0, len = listeners[uid][eventName].length; i < len; i++) { @@ -2003,6 +2010,9 @@ fabric.CommonMethods = { else { /** @ignore */ addListener = function (element, eventName, handler) { + if (!element) { + return; + } var uid = getUniqueId(element); if (!handlers[uid]) { handlers[uid] = { }; @@ -2019,6 +2029,9 @@ fabric.CommonMethods = { }; /** @ignore */ removeListener = function (element, eventName, handler) { + if (!element) { + return; + } var uid = getUniqueId(element); if (handlers[uid] && handlers[uid][eventName]) { var handlersForEvent = handlers[uid][eventName]; @@ -6067,6 +6080,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { initialize: function(el, options) { options || (options = { }); this.renderAndResetBound = this.renderAndReset.bind(this); + this.requestRenderAllBound = this.requestRenderAll.bind(this); this._initStatic(el, options); }, @@ -6124,9 +6138,12 @@ fabric.ElementsParser.prototype.checkIfDone = function() { stateful: false, /** - * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove} should also re-render canvas. - * Disabling this option could give a great performance boost when adding/removing a lot of objects to/from canvas at once - * (followed by a manual rendering after addition/deletion) + * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove}, + * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas. + * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once + * since the renders are quequed and executed one per frame. + * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() ) + * Left default to true to do not break documentation and old app, fiddles. * @type Boolean * @default */ @@ -6135,6 +6152,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { /** * Function that determines clipping of entire canvas area * Being passed context as first argument. See clipping canvas area in {@link https://github.com/kangax/fabric.js/wiki/FAQ} + * @deprecated since 2.0.0 * @type Function * @default */ @@ -6227,7 +6245,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @param {Object} [options] Options object */ _initStatic: function(el, options) { - var cb = fabric.StaticCanvas.prototype.renderAll.bind(this); + var cb = this.requestRenderAllBound; this._objects = []; this._createLowerCanvas(el); this._initOptions(options); @@ -6625,7 +6643,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this.calcOffset(); if (!options.cssOnly) { - this.renderAll(); + this.requestRenderAll(); } return this; @@ -6692,17 +6710,17 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @chainable true */ setViewportTransform: function (vpt) { - var activeGroup = this._activeGroup, object, ignoreVpt = false, skipAbsolute = true; + var activeObject = this._activeObject, object, ignoreVpt = false, skipAbsolute = true; this.viewportTransform = vpt; for (var i = 0, len = this._objects.length; i < len; i++) { object = this._objects[i]; object.group || object.setCoords(ignoreVpt, skipAbsolute); } - if (activeGroup) { - activeGroup.setCoords(ignoreVpt, skipAbsolute); + if (activeObject && activeObject.type === 'activeSelection') { + activeObject.setCoords(ignoreVpt, skipAbsolute); } this.calcViewportBoundaries(); - this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, @@ -6829,7 +6847,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { } this.clearContext(this.contextContainer); this.fire('canvas:cleared'); - this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, @@ -7082,7 +7100,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { */ _centerObject: function(object, center) { object.setPositionByOrigin(center, 'center', 'center'); - this.renderAll(); + this.requestRenderAll(); return this; }, @@ -7162,7 +7180,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @private */ __serializeBgOverlay: function(methodName, propertiesToInclude) { - var data = { }; + var data = { }, bgImage = this.backgroundImage, overlay = this.overlayImage; if (this.backgroundColor) { data.background = this.backgroundColor.toObject @@ -7175,11 +7193,11 @@ fabric.ElementsParser.prototype.checkIfDone = function() { ? this.overlayColor.toObject(propertiesToInclude) : this.overlayColor; } - if (this.backgroundImage) { - data.backgroundImage = this._toObject(this.backgroundImage, methodName, propertiesToInclude); + if (bgImage && !bgImage.excludeFromExport) { + data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude); } - if (this.overlayImage) { - data.overlayImage = this._toObject(this.overlayImage, methodName, propertiesToInclude); + if (overlay && !overlay.excludeFromExport) { + data.overlayImage = this._toObject(overlay, methodName, propertiesToInclude); } return data; @@ -7397,7 +7415,6 @@ fabric.ElementsParser.prototype.checkIfDone = function() { }, /** - * push single object svg representation in the markup * @private */ _setSVGObject: function(markup, instance, reviver) { @@ -7461,10 +7478,10 @@ fabric.ElementsParser.prototype.checkIfDone = function() { if (!object) { return this; } - var activeGroup = this._activeGroup, + var activeSelection = this._activeObject, i, obj, objs; - if (object === activeGroup) { - objs = activeGroup._objects; + if (object === activeSelection && object.type === 'activeSelection') { + objs = activeSelection._objects; for (i = objs.length; i--;) { obj = objs[i]; removeFromArray(this._objects, obj); @@ -7475,7 +7492,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { removeFromArray(this._objects, object); this._objects.unshift(object); } - this.renderAll && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, @@ -7490,10 +7507,10 @@ fabric.ElementsParser.prototype.checkIfDone = function() { if (!object) { return this; } - var activeGroup = this._activeGroup, + var activeSelection = this._activeObject, i, obj, objs; - if (object === activeGroup) { - objs = activeGroup._objects; + if (object === activeSelection && object.type === 'activeSelection') { + objs = activeSelection._objects; for (i = 0; i < objs.length; i++) { obj = objs[i]; removeFromArray(this._objects, obj); @@ -7504,7 +7521,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { removeFromArray(this._objects, object); this._objects.push(object); } - this.renderAll && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, @@ -7519,19 +7536,20 @@ fabric.ElementsParser.prototype.checkIfDone = function() { if (!object) { return this; } - var activeGroup = this._activeGroup, - i, obj, idx, newIdx, objs; + var activeSelection = this._activeObject, + i, obj, idx, newIdx, objs, objsMoved = 0; - if (object === activeGroup) { - objs = activeGroup._objects; + if (object === activeSelection && object.type === 'activeSelection') { + objs = activeSelection._objects; for (i = 0; i < objs.length; i++) { obj = objs[i]; idx = this._objects.indexOf(obj); - if (idx !== 0) { + if (idx > 0 + objsMoved) { newIdx = idx - 1; removeFromArray(this._objects, obj); this._objects.splice(newIdx, 0, obj); } + objsMoved++; } } else { @@ -7543,7 +7561,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this._objects.splice(newIdx, 0, object); } } - this.renderAll && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, @@ -7587,19 +7605,20 @@ fabric.ElementsParser.prototype.checkIfDone = function() { if (!object) { return this; } - var activeGroup = this._activeGroup, - i, obj, idx, newIdx, objs; + var activeSelection = this._activeObject, + i, obj, idx, newIdx, objs, objsMoved = 0; - if (object === activeGroup) { - objs = activeGroup._objects; + if (object === activeSelection && object.type === 'activeSelection') { + objs = activeSelection._objects; for (i = objs.length; i--;) { obj = objs[i]; idx = this._objects.indexOf(obj); - if (idx !== this._objects.length - 1) { + if (idx < this._objects.length - 1 - objsMoved) { newIdx = idx + 1; removeFromArray(this._objects, obj); this._objects.splice(newIdx, 0, obj); } + objsMoved++; } } else { @@ -7611,7 +7630,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this._objects.splice(newIdx, 0, object); } } - this.renderAll && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, @@ -7654,7 +7673,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { moveTo: function (object, index) { removeFromArray(this._objects, object); this._objects.splice(index, 0, object); - return this.renderAll && this.renderAll(); + return this.renderOnAddRemove && this.requestRenderAll(); }, /** @@ -8508,7 +8527,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @fires mouse:up * @fires mouse:over * @fires mouse:out - * @fires mouse:doubleclick + * @fires mouse:dblclick * */ fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ { @@ -8803,25 +8822,25 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @return {Array} objects to render immediately and pushes the other in the activeGroup. */ _chooseObjectsToRender: function() { - var activeGroup = this.getActiveGroup(), - activeObject = this.getActiveObject(), - object, objsToRender = [], activeGroupObjects = []; + var activeObjects = this.getActiveObjects(), + object, objsToRender, activeGroupObjects; - if ((activeGroup || activeObject) && !this.preserveObjectStacking) { + if (activeObjects.length > 0 && !this.preserveObjectStacking) { + objsToRender = []; + activeGroupObjects = []; for (var i = 0, length = this._objects.length; i < length; i++) { object = this._objects[i]; - if ((!activeGroup || !activeGroup.contains(object)) && object !== activeObject) { + if (activeObjects.indexOf(object) === -1 ) { objsToRender.push(object); } else { activeGroupObjects.push(object); } } - if (activeGroup) { - activeGroup._set('_objects', activeGroupObjects); - objsToRender.push(activeGroup); + if (activeObjects.length > 1) { + this._activeObject._objects = activeGroupObjects; } - activeObject && objsToRender.push(activeObject); + objsToRender.push.apply(objsToRender, activeGroupObjects); } else { objsToRender = this._objects; @@ -8924,7 +8943,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab pointer = point || this.getPointer(e, ignoreZoom), xy; - if (target.group && target.group === this.getActiveGroup()) { + if (target.group && target.group === this._activeObject && target.group.type === 'activeSelection') { xy = this._normalizePointer(target.group, pointer); } else { @@ -8986,16 +9005,16 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {fabric.Object} target */ _shouldClearSelection: function (e, target) { - var activeGroup = this.getActiveGroup(), - activeObject = this.getActiveObject(); - + var activeObjects = this.getActiveObjects(), + activeObject = this._activeObject; return ( !target || (target && - activeGroup && - !activeGroup.contains(target) && - activeGroup !== target && + activeObject && + activeObjects.length > 1 && + activeObjects.indexOf(target) === -1 && + activeObject !== target && !e[this.selectionKey]) || (target && !target.evented) @@ -9579,23 +9598,25 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab var ignoreZoom = true, pointer = this.getPointer(e, ignoreZoom), - activeGroup = this.getActiveGroup(), - activeObject = this.getActiveObject(), + activeObject = this._activeObject, + aObjects = this.getActiveObjects(), activeTarget; // first check current group (if one exists) // active group does not check sub targets like normal groups. // if active group just exits. this.targets = []; - if (activeGroup && !skipGroup && activeGroup === this._searchPossibleTargets([activeGroup], pointer)) { - this._fireOverOutEvents(activeGroup, e); - return activeGroup; - } - // if we hit the corner of an activeObject, let's return that. - if (activeObject && activeObject._findTargetCorner(pointer)) { + + if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) { this._fireOverOutEvents(activeObject, e); return activeObject; } - if (activeObject && activeObject === this._searchPossibleTargets([activeObject], pointer)) { + // if we hit the corner of an activeObject, let's return that. + if (aObjects.length === 1 && activeObject._findTargetCorner(pointer)) { + this._fireOverOutEvents(activeObject, e); + return activeObject; + } + if (aObjects.length === 1 && + activeObject === this._searchPossibleTargets([activeObject], pointer)) { if (!this.preserveObjectStacking) { this._fireOverOutEvents(activeObject, e); return activeObject; @@ -9604,7 +9625,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab activeTarget = activeObject; } } - var target = this._searchPossibleTargets(this._objects, pointer); if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) { target = activeTarget; @@ -9849,41 +9869,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab return this.upperCanvasEl; }, - /** - * @private - * @param {Object} object - */ - _setActiveObject: function(object) { - var obj = this._activeObject; - if (obj) { - obj.set('active', false); - if (object !== obj && obj.onDeselect && typeof obj.onDeselect === 'function') { - obj.onDeselect(); - } - } - this._activeObject = object; - object.set('active', true); - }, - - /** - * Sets given object as the only active object on canvas - * @param {fabric.Object} object Object to set as an active one - * @param {Event} [e] Event (passed along when firing "object:selected") - * @return {fabric.Canvas} thisArg - * @chainable - */ - setActiveObject: function (object, e) { - var currentActiveObject = this.getActiveObject(); - if (currentActiveObject && currentActiveObject !== object) { - currentActiveObject.fire('deselected', { e: e }); - } - this._setActiveObject(object); - this.fire('object:selected', { target: object, e: e }); - object.fire('selected', { e: e }); - this.requestRenderAll(); - return this; - }, - /** * Returns currently active object * @return {fabric.Object} active object @@ -9892,13 +9877,30 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab return this._activeObject; }, + /** + * Returns an array with the current selected objects + * @return {fabric.Object} active object + */ + getActiveObjects: function () { + var active = this._activeObject; + if (active) { + if (active.type === 'activeSelection' && active._objects) { + return active._objects; + } + else { + return [active]; + } + } + return []; + }, + /** * @private * @param {fabric.Object} obj Object that was removed */ _onObjectRemoved: function(obj) { // removing active object should fire "selection:cleared" events - if (this.getActiveObject() === obj) { + if (obj === this._activeObject) { this.fire('before:selection:cleared', { target: obj }); this._discardActiveObject(); this.fire('selection:cleared', { target: obj }); @@ -9910,18 +9912,57 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this.callSuper('_onObjectRemoved', obj); }, + /** + * Sets given object as the only active object on canvas + * @param {fabric.Object} object Object to set as an active one + * @param {Event} [e] Event (passed along when firing "object:selected") + * @return {fabric.Canvas} thisArg + * @chainable + */ + setActiveObject: function (object, e) { + var currentActiveObject = this._activeObject; + if (object === currentActiveObject) { + return this; + } + if (this._setActiveObject(object)) { + currentActiveObject && currentActiveObject.fire('deselected', { e: e }); + this.fire('object:selected', { target: object, e: e }); + object.fire('selected', { e: e }); + }; + return this; + }, + + /** + * @private + * @param {Object} object + */ + _setActiveObject: function(object) { + var active = this._activeObject; + if (active === object) { + return false; + } + if (this._discardActiveObject()) { + this._activeObject = object; + object.set('active', true); + return true; + } + return false; + }, + /** * @private */ _discardActiveObject: function() { var obj = this._activeObject; - if (obj) { - obj.set('active', false); - if (obj.onDeselect && typeof obj.onDeselect === 'function') { - obj.onDeselect(); + if (obj && obj.onDeselect && typeof obj.onDeselect === 'function') { + // onDeselect return TRUE to cancel selection; + if (obj.onDeselect()) { + return false; } + obj.set('active', false); + this._activeObject = null; } - this._activeObject = null; + return true; }, /** @@ -9937,128 +9978,21 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab var activeObject = this._activeObject; if (activeObject) { this.fire('before:selection:cleared', { target: activeObject, e: e }); - this._discardActiveObject(); - this.fire('selection:cleared', { e: e }); - activeObject.fire('deselected', { e: e }); + if (this._discardActiveObject()) { + this.fire('selection:cleared', { e: e }); + activeObject.fire('deselected', { e: e }); + } } return this; }, - /** - * @private - * @param {fabric.Group} group - */ - _setActiveGroup: function(group) { - this._activeGroup = group; - if (group) { - group.set('active', true); - } - }, - - /** - * Sets active group to a specified one. If the function is called by fabric - * as a consequence of a mouse event, the event is passed as a parmater and - * sent to the fire function for the custom events. When used as a method the - * e param does not have any application. - * @param {fabric.Group} group Group to set as a current one - * @param {Event} e Event object - * @return {fabric.Canvas} thisArg - * @chainable - */ - setActiveGroup: function (group, e) { - this._setActiveGroup(group); - if (group) { - this.fire('object:selected', { target: group, e: e }); - group.fire('selected', { e: e }); - } - return this; - }, - - /** - * Returns currently active group - * @return {fabric.Group} Current group - */ - getActiveGroup: function () { - return this._activeGroup; - }, - - /** - * @private - */ - _discardActiveGroup: function() { - var g = this.getActiveGroup(); - if (g) { - g.destroy(); - } - this.setActiveGroup(null); - }, - - /** - * Discards currently active group and fire events If the function is called by fabric - * as a consequence of a mouse event, the event is passed as a parmater and - * sent to the fire function for the custom events. When used as a method the - * e param does not have any application. - * @return {fabric.Canvas} thisArg - * @chainable - */ - discardActiveGroup: function (e) { - var g = this.getActiveGroup(); - if (g) { - this.fire('before:selection:cleared', { e: e, target: g }); - this._discardActiveGroup(); - this.fire('selection:cleared', { e: e }); - } - return this; - }, - - /** - * Deactivates all objects on canvas, removing any active group or object - * @return {fabric.Canvas} thisArg - * @chainable - */ - deactivateAll: function () { - var allObjects = this.getObjects(), - i = 0, - len = allObjects.length, - obj; - for ( ; i < len; i++) { - obj = allObjects[i]; - obj && obj.set('active', false); - } - this._discardActiveGroup(); - this._discardActiveObject(); - return this; - }, - - /** - * Deactivates all objects and dispatches appropriate events If the function is called by fabric - * as a consequence of a mouse event, the event is passed as a parmater and - * sent to the fire function for the custom events. When used as a method the - * e param does not have any application. - * @return {fabric.Canvas} thisArg - * @chainable - */ - deactivateAllWithDispatch: function (e) { - var allObjects = this.getObjects(), - i = 0, - len = allObjects.length, - obj; - for ( ; i < len; i++) { - obj = allObjects[i]; - obj && obj.set('active', false); - } - this.discardActiveGroup(e); - this.discardActiveObject(e); - return this; - }, - /** * Clears a canvas element and removes all event listeners * @return {fabric.Canvas} thisArg * @chainable */ dispose: function () { - this.callSuper('dispose'); + fabric.StaticCanvas.prototype.dispose.call(this); var wrapper = this.wrapperEl; this.removeListeners(); wrapper.removeChild(this.upperCanvasEl); @@ -10077,7 +10011,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @chainable */ clear: function () { - this.discardActiveGroup(); + // this.discardActiveGroup(); this.discardActiveObject(); this.clearContext(this.contextTop); return this.callSuper('clear'); @@ -10088,27 +10022,10 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {CanvasRenderingContext2D} ctx Context to render controls on */ drawControls: function(ctx) { - var activeGroup = this.getActiveGroup(); + var activeObject = this._activeObject; - if (activeGroup) { - activeGroup._renderControls(ctx); - } - else { - this._drawObjectsControls(ctx); - } - }, - - /** - * @private - */ - _drawObjectsControls: function(ctx) { - var object; - for (var i = 0, len = this._objects.length; i < len; ++i) { - object = this._objects[i]; - if (!object || !object.active) { - continue; - } - object._renderControls(ctx); + if (activeObject) { + activeObject._renderControls(ctx); } }, @@ -10134,14 +10051,14 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @returns the original values of instance which were changed */ _realizeGroupTransformOnObject: function(instance) { - var layoutProps = ['angle', 'flipX', 'flipY', 'height', 'left', 'scaleX', 'scaleY', 'top', 'width']; - if (instance.group && instance.group === this.getActiveGroup()) { + if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) { + var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top']; //Copy all the positionally relevant properties across now var originalValues = {}; layoutProps.forEach(function(prop) { originalValues[prop] = instance[prop]; }); - this.getActiveGroup().realizeTransform(instance); + this._activeObject.realizeTransform(instance); return originalValues; } else { @@ -10165,10 +10082,9 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @private */ _setSVGObject: function(markup, instance, reviver) { - var originalProperties; //If the object is in a selection group, simulate what would happen to that //object when the group is deselected - originalProperties = this._realizeGroupTransformOnObject(instance); + var originalProperties = this._realizeGroupTransformOnObject(instance); this.callSuper('_setSVGObject', markup, instance, reviver); this._unwindGroupTransformOnObject(instance, originalProperties); }, @@ -10485,7 +10401,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Object} pointer */ _shouldRender: function(target, pointer) { - var activeObject = this.getActiveGroup() || this.getActiveObject(); + var activeObject = this._activeObject; if (activeObject && activeObject.isEditing && target === activeObject) { // if we mouse up/down over a editing textbox a cursor change, @@ -10724,16 +10640,14 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab // save pointer for check in __onMouseUp event var pointer = this.getPointer(e, true); this._previousPointer = pointer; - var shouldRender = this._shouldRender(target, pointer), shouldGroup = this._shouldGroup(e, target); - if (this._shouldClearSelection(e, target)) { - this.deactivateAllWithDispatch(e); + this.discardActiveObject(e); } else if (shouldGroup) { this._handleGrouping(e, target); - target = this.getActiveGroup(); + target = this._activeObject; } if (this.selection && (!target || (!target.selectable && !target.isEditing))) { @@ -10750,13 +10664,11 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this._beforeTransform(e, target); this._setupCurrentTransform(e, target); } - var activeObject = this.getActiveObject(); - if (target !== this.getActiveGroup() && target !== activeObject) { - this.deactivateAll(); - if (target.selectable) { - activeObject && activeObject.fire('deselected', { e: e }); - this.setActiveObject(target, e); - } + if (target.selectable) { + this.setActiveObject(target, e); + } + else { + this.discardActiveObject(); } } this._handleEvent(e, 'down', target ? target : null); @@ -10997,10 +10909,10 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab } var hoverCursor = target.hoverCursor || this.hoverCursor, - activeGroup = this.getActiveGroup(), + activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ? + this._activeObject : null, // only show proper corner when group selection is not active - corner = target._findTargetCorner - && (!activeGroup || !activeGroup.contains(target)) + corner = (!activeSelection || !activeSelection.contains(target)) && target._findTargetCorner(this.getPointer(e, true)); if (!corner) { @@ -11082,10 +10994,9 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @return {Boolean} */ _shouldGroup: function(e, target) { - var activeObject = this.getActiveObject(); - return e[this.selectionKey] && target && target.selectable && - (this.getActiveGroup() || (activeObject && activeObject !== target)) - && this.selection; + var activeObject = this._activeObject; + return e[this.selectionKey] && target && target.selectable && this.selection && + (activeObject !== target || activeObject.type === 'activeSelection'); }, /** @@ -11094,67 +11005,52 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {fabric.Object} target */ _handleGrouping: function (e, target) { - var activeGroup = this.getActiveGroup(); - - if (target === activeGroup) { + var activeObject = this._activeObject; + if (activeObject.__corner !== 0) { + return; + } + if (target === activeObject) { // if it's a group, find target again, using activeGroup objects target = this.findTarget(e, true); - // if even object is not found, bail out + // if even object is not found or we are on activeObjectCorner, bail out if (!target) { return; } } - if (activeGroup) { - this._updateActiveGroup(target, e); + if (activeObject && activeObject.type === 'activeSelection') { + this._updateActiveSelection(target, e); } else { - this._createActiveGroup(target, e); + this._createActiveSelection(target, e); } }, /** * @private */ - _updateActiveGroup: function(target, e) { - var activeGroup = this.getActiveGroup(); - - if (activeGroup.contains(target)) { - - activeGroup.removeWithUpdate(target); - target.set('active', false); - - if (activeGroup.size() === 1) { - // remove group alltogether if after removal it only contains 1 object - this.discardActiveGroup(e); + _updateActiveSelection: function(target, e) { + var activeSelection = this._activeObject; + if (activeSelection.contains(target)) { + activeSelection.removeWithUpdate(target); + if (activeSelection.size() === 1) { // activate last remaining object - this.setActiveObject(activeGroup.item(0), e); + this.setActiveObject(activeSelection.item(0), e); return; } } else { - activeGroup.addWithUpdate(target); + activeSelection.addWithUpdate(target); } - this.fire('selection:created', { target: activeGroup, e: e }); - activeGroup.set('active', true); + this.fire('selection:created', { target: activeSelection, e: e }); }, /** * @private */ - _createActiveGroup: function(target, e) { - - if (this._activeObject && target !== this._activeObject) { - - var group = this._createGroup(target); - group.addWithUpdate(); - - this.setActiveGroup(group, e); - this._activeObject = null; - - this.fire('selection:created', { target: group, e: e }); - } - - target.set('active', true); + _createActiveSelection: function(target, e) { + var group = this._createGroup(target); + this.setActiveObject(group, e); + this.fire('selection:created', { target: group, e: e }); }, /** @@ -11162,14 +11058,13 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Object} target */ _createGroup: function(target) { - var objects = this.getObjects(), isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target), groupObjects = isActiveLower ? [this._activeObject, target] : [target, this._activeObject]; this._activeObject.isEditing && this._activeObject.exitEditing(); - return new fabric.Group(groupObjects, { + return new fabric.ActiveSelection(groupObjects, { canvas: this }); }, @@ -11187,11 +11082,10 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this.setActiveObject(group[0], e); } else if (group.length > 1) { - group = new fabric.Group(group.reverse(), { + group = new fabric.ActiveSelection(group.reverse(), { canvas: this }); - group.addWithUpdate(); - this.setActiveGroup(group, e); + this.setActiveObject(group, e); this.fire('selection:created', { target: group, e: e }); this.requestRenderAll(); } @@ -11223,7 +11117,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab currentObject.containsPoint(selectionX1Y1) || currentObject.containsPoint(selectionX2Y2) ) { - currentObject.set('active', true); group.push(currentObject); // only add one object if it's a click @@ -11243,14 +11136,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab if (this.selection && this._groupSelector) { this._groupSelectedObjects(e); } - - var activeGroup = this.getActiveGroup(); - if (activeGroup) { - activeGroup.setObjectsCoords().setCoords(); - activeGroup.isMoving = false; - this.setCursor(this.defaultCursor); - } - + this.setCursor(this.defaultCursor); // clear selection and current transformation this._groupSelector = null; this._currentTransform = null; @@ -12042,6 +11928,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * Function that determines clipping of an object (context is passed as a first argument) * Note that context origin is at the object's center point (not left/top corner) + * @deprecated since 2.0.0 * @type Function */ clipTo: null, @@ -12396,7 +12283,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati }; fabric.util.populateWithProperties(this, object, propertiesToInclude); - if (!this.includeDefaultValues) { object = this._removeDefaultValues(object); } @@ -12775,7 +12661,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati if (!this.group) { ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; } - if (this.group && this.group === this.canvas.getActiveGroup()) { + if (styleOverride.forActiveSelection) { ctx.rotate(degreesToRadians(options.angle)); drawBorders && this.drawBordersInGroup(ctx, options, styleOverride); } @@ -14066,25 +13952,40 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati calcTransformMatrix: function(skipGroup) { var center = this.getCenterPoint(), translateMatrix = [1, 0, 0, 1, center.x, center.y], - rotateMatrix = this._calcRotateMatrix(), + rotateMatrix, dimensionMatrix = this._calcDimensionsTransformMatrix(this.skewX, this.skewY, true), - matrix = this.group && !skipGroup ? this.group.calcTransformMatrix() : fabric.iMatrix.concat(); - matrix = multiplyMatrices(matrix, translateMatrix); - matrix = multiplyMatrices(matrix, rotateMatrix); + matrix; + if (this.group && !skipGroup) { + matrix = multiplyMatrices(this.group.calcTransformMatrix(), translateMatrix); + } + else { + matrix = translateMatrix; + } + if (this.angle) { + rotateMatrix = this._calcRotateMatrix(); + matrix = multiplyMatrices(matrix, rotateMatrix); + } matrix = multiplyMatrices(matrix, dimensionMatrix); return matrix; }, _calcDimensionsTransformMatrix: function(skewX, skewY, flipping) { - var skewMatrixX = [1, 0, Math.tan(degreesToRadians(skewX)), 1], - skewMatrixY = [1, Math.tan(degreesToRadians(skewY)), 0, 1], + var skewMatrix, scaleX = this.scaleX * (flipping && this.flipX ? -1 : 1), scaleY = this.scaleY * (flipping && this.flipY ? -1 : 1), - scaleMatrix = [scaleX, 0, 0, scaleY], - m = multiplyMatrices(scaleMatrix, skewMatrixX, true); - return multiplyMatrices(m, skewMatrixY, true); + scaleMatrix = [scaleX, 0, 0, scaleY, 0, 0]; + if (skewX) { + skewMatrix = [1, 0, Math.tan(degreesToRadians(skewX)), 1]; + scaleMatrix = multiplyMatrices(scaleMatrix, skewMatrix, true); + } + if (skewY) { + skewMatrix = [1, Math.tan(degreesToRadians(skewY)), 0, 1]; + scaleMatrix = multiplyMatrices(scaleMatrix, skewMatrix, true); + } + return scaleMatrix; }, + /* * Calculate object dimensions from its properties * @private @@ -14555,7 +14456,9 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found */ _findTargetCorner: function(pointer) { - if (!this.hasControls || !this.active) { + // objects in group, anykind, are not self modificable, + // must not return an hovered corner. + if (!this.hasControls || !this.active || this.group) { return false; } @@ -14653,7 +14556,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @chainable */ drawSelectionBackground: function(ctx) { - if (!this.selectionBackgroundColor || this.group || !this.active || + if (!this.selectionBackgroundColor || !this.active || (this.canvas && !this.canvas.interactive)) { return this; } @@ -17113,7 +17016,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {Object} object representation of an instance */ toObject: function(propertiesToInclude) { - var o = extend(this.callSuper('toObject', ['sourcePath', 'pathOffset'].concat(propertiesToInclude)), { + var o = extend(this.callSuper('toObject', propertiesToInclude), { path: this.path.map(function(item) { return item.slice(); }), top: this.top, left: this.left, @@ -17127,11 +17030,10 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {Object} object representation of an instance */ toDatalessObject: function(propertiesToInclude) { - var o = this.toObject(propertiesToInclude); - if (this.sourcePath) { - o.path = this.sourcePath; + var o = this.toObject(['sourcePath'].concat(propertiesToInclude)); + if (o.sourcePath) { + delete o.path; } - delete o.sourcePath; return o; }, @@ -17553,15 +17455,11 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created */ fabric.Path.fromObject = function(object, callback) { - if (typeof object.path === 'string') { - var pathUrl = object.path; + if (typeof object.sourcePath === 'string') { + var pathUrl = object.sourcePath; fabric.loadSVGFromURL(pathUrl, function (elements) { var path = elements[0]; - delete object.path; - path.setOptions(object); - path.setSourcePath(pathUrl); - callback && callback(path); }); } @@ -17687,17 +17585,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this.originY = options.originY; } - if (isAlreadyGrouped) { - // do not change coordinate of objects enclosed in a group, - // because objects coordinate system have been group coodinate system already. - var object; - for (var i = this._objects.length; i--; ) { - object = this._objects[i]; - object.__origHasControls = object.hasControls; - object.hasControls = false; - } - } - else { + if (!isAlreadyGrouped) { var center = options && options.centerPoint; // if coming from svg i do not want to calc bounds. // i assume width and height are passed along options @@ -17727,10 +17615,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {fabric.Point} center, current center of group. */ _updateObjectCoords: function(object, center) { - // do not display corners of objects enclosed in a group - object.__origHasControls = object.hasControls; - object.hasControls = false; - var objectLeft = object.left, objectTop = object.top, ignoreZoom = true, skipAbsolute = true; @@ -17739,6 +17623,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot left: objectLeft - center.x, top: objectTop - center.y }); + object.group = this; object.setCoords(ignoreZoom, skipAbsolute); }, @@ -17764,8 +17649,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot object.group = this; object._set('canvas', this.canvas); } - // since _restoreObjectsState set objects inactive - this.forEachObject(this._setObjectActive, this); this._calcBounds(); this._updateObjectsCoords(); this.setCoords(); @@ -17773,14 +17656,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return this; }, - /** - * @private - */ - _setObjectActive: function(object) { - object.set('active', true); - object.group = this; - }, - /** * Removes an object from a group; Then recalculates group's dimension, position. * @param {Object} object @@ -17790,8 +17665,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot removeWithUpdate: function(object) { this._restoreObjectsState(); fabric.util.resetObjectTransform(this); - // since _restoreObjectsState set objects inactive - this.forEachObject(this._setObjectActive, this); this.remove(object); this._calcBounds(); @@ -17807,7 +17680,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot _onObjectAdded: function(object) { this.dirty = true; object.group = this; - object._set('canvas', this.canvas); }, /** @@ -17816,7 +17688,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot _onObjectRemoved: function(object) { this.dirty = true; delete object.group; - object.set('active', false); }, /** @@ -17824,18 +17695,11 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ _set: function(key, value) { var i = this._objects.length; - - if (key === 'canvas') { - while (i--) { - this._objects[i].set(key, value); - } - } if (this.useSetOnGroup) { while (i--) { this._objects[i].setOnGroup(key, value); } } - this.callSuper('_set', key, value); }, @@ -17943,7 +17807,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ drawObject: function(ctx) { for (var i = 0, len = this._objects.length; i < len; i++) { - this._renderObject(this._objects[i], ctx); + this._objects[i].render(ctx); } }, @@ -17970,34 +17834,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return false; }, - /** - * Renders controls and borders for the object - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [styleOverride] properties to override the object style - * @param {Object} [childrenOverride] properties to override the children overrides - */ - _renderControls: function(ctx, styleOverride, childrenOverride) { - ctx.save(); - ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; - this.callSuper('_renderControls', ctx, styleOverride); - if (this.canvas && this === this.canvas.getActiveGroup()) { - for (var i = 0, len = this._objects.length; i < len; i++) { - this._objects[i]._renderControls(ctx, childrenOverride); - } - } - ctx.restore(); - }, - - /** - * @private - */ - _renderObject: function(object, ctx) { - var originalHasRotatingPoint = object.hasRotatingPoint; - object.hasRotatingPoint = false; - object.render(ctx); - object.hasRotatingPoint = originalHasRotatingPoint; - }, - /** * Retores original state of each of group objects (original state is that which was before group was created). * @private @@ -18041,11 +17877,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot _restoreObjectState: function(object) { this.realizeTransform(object); object.setCoords(); - object.hasControls = object.__origHasControls; - delete object.__origHasControls; - object.set('active', false); delete object.group; - return this; }, @@ -18058,6 +17890,43 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return this._restoreObjectsState(); }, + /** + * make a group an active selection, remove the group from canvas + * the group has to be on canvas for this to work. + * @return {fabric.ActiveSelection} thisArg + * @chainable + */ + toActiveSelection: function() { + if (!this.canvas) { + return; + } + var objects = this._objects, canvas = this.canvas; + this._objects = []; + var options = this.toObject(); + var activeSelection = new fabric.ActiveSelection([]); + activeSelection.set(options); + activeSelection.type = 'activeSelection'; + canvas.remove(this); + objects.forEach(function(object) { + object.group = activeSelection; + object.dirty = true; + canvas.add(object); + }); + activeSelection._objects = objects; + canvas._activeObject = activeSelection; + activeSelection.setCoords(); + return activeSelection; + }, + + /** + * Destroys a group (restoring state of its objects) + * @return {fabric.Group} thisArg + * @chainable + */ + ungroupOnCanvas: function() { + return this._restoreObjectsState(); + }, + /** * Sets coordinates of all objects inside group * @return {fabric.Group} thisArg @@ -18163,9 +18032,205 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {Function} [callback] Callback to invoke when an group instance is created */ fabric.Group.fromObject = function(object, callback) { + fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { + var options = fabric.util.object.clone(object, true); + delete options.objects; + callback && callback(new fabric.Group(enlivenedObjects, options, true)); + }); + }; + +})(typeof exports !== 'undefined' ? exports : this); + + +(function(global) { + + 'use strict'; + + var fabric = global.fabric || (global.fabric = { }); + + if (fabric.ActiveSelection) { + return; + } + + /** + * Group class + * @class fabric.ActiveSelection + * @extends fabric.Group + * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} + * @see {@link fabric.ActiveSelection#initialize} for constructor definition + */ + fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ { + + /** + * Type of an object + * @type String + * @default + */ + type: 'activeSelection', + + /** + * Constructor + * @param {Object} objects ActiveSelection objects + * @param {Object} [options] Options object + * @return {Object} thisArg + */ + initialize: function(objects, options) { + options = options || { }; + + this._objects = objects || []; + for (var i = this._objects.length; i--; ) { + this._objects[i].group = this; + } + + if (options.originX) { + this.originX = options.originX; + } + if (options.originY) { + this.originY = options.originY; + } + this._calcBounds(); + this._updateObjectsCoords(); + fabric.Object.prototype.initialize.call(this, options); + this.setCoords(); + }, + + /** + * Change te activeSelection to a normal group, + * High level function that automatically adds it to canvas as + * active object. no events fired. + * @since 2.0.0 + * @return {fabric.Group} + */ + toGroup: function() { + var objects = this._objects; + this._objects = []; + var options = this.toObject(); + var newGroup = new fabric.Group([]); + newGroup.set(options); + newGroup.type = 'group'; + objects.forEach(function(object) { + object.group = newGroup; + object.canvas.remove(object); + }); + newGroup._objects = objects; + if (!this.canvas) { + return newGroup; + } + var canvas = this.canvas; + canvas._activeObject = newGroup; + canvas.add(newGroup); + newGroup.setCoords(); + return newGroup; + }, + + /** + * If returns true, deselection is cancelled. + * @since 2.0.0 + * @return {Boolean} [cancel] + */ + onDeselect: function() { + this.destroy(); + return false; + }, + + /** + * Returns string represenation of a group + * @return {String} + */ + toString: function() { + return '#'; + }, + + /** + * @private + */ + _set: function(key, value) { + var i = this._objects.length; + if (key === 'canvas') { + while (i--) { + this._objects[i].set(key, value); + } + } + if (this.useSetOnGroup) { + while (i--) { + this._objects[i].setOnGroup(key, value); + } + } + fabric.Object.prototype._set.call(this, key, value); + }, + + /** + * Decide if the object should cache or not. Create its own cache level + * objectCaching is a global flag, wins over everything + * needsItsOwnCache should be used when the object drawing method requires + * a cache step. None of the fabric classes requires it. + * Generally you do not cache objects in groups because the group outside is cached. + * @return {Boolean} + */ + shouldCache: function() { + return false; + }, + + /** + * Check if this object or a child object will cast a shadow + * @return {Boolean} + */ + willDrawShadow: function() { + if (this.shadow) { + return this.callSuper('willDrawShadow'); + } + for (var i = 0, len = this._objects.length; i < len; i++) { + if (this._objects[i].willDrawShadow()) { + return true; + } + } + return false; + }, + + /** + * Check if this group or its parent group are caching, recursively up + * @return {Boolean} + */ + isOnACache: function() { + return false; + }, + + /** + * Renders controls and borders for the object + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Object} [styleOverride] properties to override the object style + * @param {Object} [childrenOverride] properties to override the children overrides + */ + _renderControls: function(ctx, styleOverride, childrenOverride) { + ctx.save(); + ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; + this.callSuper('_renderControls', ctx, styleOverride); + childrenOverride = childrenOverride || { }; + if (typeof childrenOverride.hasControls === 'undefined') { + childrenOverride.hasControls = false; + } + if (typeof childrenOverride.hasRotatingPoint === 'undefined') { + childrenOverride.hasRotatingPoint = false; + } + childrenOverride.forActiveSelection = true; + for (var i = 0, len = this._objects.length; i < len; i++) { + this._objects[i]._renderControls(ctx, childrenOverride); + } + ctx.restore(); + }, + }); + + /** + * Returns {@link fabric.ActiveSelection} instance from an object representation + * @static + * @memberOf fabric.ActiveSelection + * @param {Object} object Object to create a group from + * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created + */ + fabric.ActiveSelection.fromObject = function(object, callback) { fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { delete object.objects; - callback && callback(new fabric.Group(enlivenedObjects, object, true)); + callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true)); }); }; @@ -18454,7 +18519,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot filtered = true; markup.push( '\n', - '\n' ); if (this.stroke || this.strokeDashArray) { @@ -18913,7 +18978,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati */ straightenObject: function (object) { object.straighten(); - this.renderAll(); + this.requestRenderAll(); return this; }, @@ -18925,7 +18990,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati */ fxStraightenObject: function (object) { object.fxStraighten({ - onChange: this.renderAll.bind(this) + onChange: this.requestRenderAllBound }); return this; } @@ -18994,6 +19059,55 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati this.createWebGLCanvas(width, height); // eslint-disable-next-line this.squareVertices = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]); + this.chooseFastestCopyGLTo2DMethod(width, height); + }, + + /** + * Pick a method to copy data from GL context to 2d canvas. In some browsers using + * putImageData is faster than drawImage for that specific operation. + */ + chooseFastestCopyGLTo2DMethod: function(width, height) { + var canMeasurePerf = typeof window.performance !== 'undefined'; + var canUseImageData; + try { + new ImageData(1, 1); + canUseImageData = true; + } + catch (e) { + canUseImageData = false; + } + // eslint-disable-next-line no-undef + var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined'; + // eslint-disable-next-line no-undef + var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined'; + + if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) { + return; + } + + var targetCanvas = fabric.util.createCanvasElement(); + // eslint-disable-next-line no-undef + var imageBuffer = new ArrayBuffer(width * height * 4); + var testContext = { imageBuffer: imageBuffer }; + var startTime, drawImageTime, putImageDataTime; + targetCanvas.width = width; + targetCanvas.height = height; + + startTime = window.performance.now(); + copyGLTo2DDrawImage.call(testContext, this.gl, targetCanvas); + drawImageTime = window.performance.now() - startTime; + + startTime = window.performance.now(); + copyGLTo2DPutImageData.call(testContext, this.gl, targetCanvas); + putImageDataTime = window.performance.now() - startTime; + + if (drawImageTime > putImageDataTime) { + this.imageBuffer = imageBuffer; + this.copyGLTo2D = copyGLTo2DPutImageData; + } + else { + this.copyGLTo2D = copyGLTo2DDrawImage; + } }, /** @@ -19051,11 +19165,12 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati squareVertices: this.squareVertices, programCache: this.programCache, pass: 0, + filterBackend: this }; var tempFbo = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo); filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); }); - this.copyGLTo2D(gl.canvas, targetCanvas); + this.copyGLTo2D(gl, targetCanvas); gl.bindTexture(gl.TEXTURE_2D, null); gl.deleteTexture(pipelineState.sourceTexture); gl.deleteTexture(pipelineState.targetTexture); @@ -19142,8 +19257,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati createTexture: function(gl, width, height, textureImageSource) { var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); if (textureImageSource) { @@ -19176,25 +19291,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati } }, - /** - * Copy an input WebGL canvas on to an output 2D canvas. - * - * The WebGL canvas is assumed to be upside down, with the top-left pixel of the - * desired output image appearing in the bottom-left corner of the WebGL canvas. - * - * @param {HTMLCanvasElement} sourceCanvas The WebGL source canvas to copy from. - * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. - */ - copyGLTo2D: function(sourceCanvas, targetCanvas) { - var ctx = targetCanvas.getContext('2d'); - ctx.translate(0, targetCanvas.height); // move it down again - ctx.scale(1, -1); // vertical flip - // where is my image on the big glcanvas? - var sourceY = sourceCanvas.height - targetCanvas.height; - ctx.drawImage(sourceCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0, - targetCanvas.width, targetCanvas.height); - }, - /** * Clear out cached resources related to a source image that has been * filtered previously. @@ -19208,6 +19304,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati } }, + copyGLTo2D: copyGLTo2DDrawImage, + /** * Attempt to extract GPU information strings from a WebGL context. * @@ -19238,6 +19336,47 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati }; })(); +/** + * Copy an input WebGL canvas on to an output 2D canvas. + * + * The WebGL canvas is assumed to be upside down, with the top-left pixel of the + * desired output image appearing in the bottom-left corner of the WebGL canvas. + * + * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. + * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. + */ +function copyGLTo2DDrawImage(gl, targetCanvas) { + var sourceCanvas = gl.canvas; + var ctx = targetCanvas.getContext('2d'); + ctx.translate(0, targetCanvas.height); // move it down again + ctx.scale(1, -1); // vertical flip + // where is my image on the big glcanvas? + var sourceY = sourceCanvas.height - targetCanvas.height; + ctx.drawImage(sourceCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0, + targetCanvas.width, targetCanvas.height); +} + +/** + * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData + * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra). + * + * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. + * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. + */ +function copyGLTo2DPutImageData(gl, targetCanvas) { + var ctx = targetCanvas.getContext('2d'); + var width = targetCanvas.width; + var height = targetCanvas.height; + var numBytes = width * height * 4; + // eslint-disable-next-line no-undef + var u8 = new Uint8Array(this.imageBuffer, 0, numBytes); + // eslint-disable-next-line no-undef + var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes); + gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, u8); + var imgData = new ImageData(u8Clamped, width); + ctx.putImageData(imgData, 0, 0); +} + (function() { @@ -19291,6 +19430,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati originalImageData: originalImageData, canvasEl: targetCanvas, ctx: ctx, + filterBackend: this, }; filters.forEach(function(filter) { filter.applyTo(pipelineState); }); if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) { @@ -21061,12 +21201,12 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { * @memberOf fabric.Image.filters * @extends fabric.Image.filters.BaseFilter * @example - * var filter = new fabric.Image.filters.Blend({ + * var filter = new fabric.Image.filters.BlendColor({ * color: '#000', * mode: 'multiply' * }); * - * var filter = new fabric.Image.filters.BlendColor({ + * var filter = new fabric.Image.filters.BlendImage({ * image: fabricImageObject, * mode: 'multiply', * alpha: 0.5 @@ -21339,13 +21479,258 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { * @static * @param {Object} object Object to create an instance from * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.Blend + * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor */ fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== 'undefined' ? exports : this); +(function(global) { + 'use strict'; + + var fabric = global.fabric, + filters = fabric.Image.filters, + createClass = fabric.util.createClass; + + /** + * Image Blend filter class + * @class fabric.Image.filter.BlendImage + * @memberOf fabric.Image.filters + * @extends fabric.Image.filters.BaseFilter + * @example + * var filter = new fabric.Image.filters.BlendColor({ + * color: '#000', + * mode: 'multiply' + * }); + * + * var filter = new fabric.Image.filters.BlendImage({ + * image: fabricImageObject, + * mode: 'multiply', + * alpha: 0.5 + * }); + * object.filters.push(filter); + * object.applyFilters(); + * canvas.renderAll(); + */ + + filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ { + type: 'BlendImage', + + /** + * Color to make the blend operation with. default to a reddish color since black or white + * gives always strong result. + **/ + image: null, + + /** + * Blend mode for the filter: one of multiply, add, diff, screen, subtract, + * darken, lighten, overlay, exclusion, tint. + **/ + mode: 'multiply', + + /** + * alpha value. represent the strength of the blend color operation. + **/ + alpha: 1, + + vertexSource: 'attribute vec2 aPosition;\n' + + 'attribute vec2 aTexCoord;\n' + + 'varying vec2 vTexCoord;\n' + + 'varying vec2 vTexCoord2;\n' + + 'uniform mat3 uTransformMatrix;\n' + + 'void main() {\n' + + 'vTexCoord = aTexCoord;\n' + + 'vTexCoord2 = (uTransformMatrix * vec3(aTexCoord, 1.0)).xy;\n' + + 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + + '}', + + /** + * Fragment source for the Multiply program + */ + fragmentSource: { + multiply: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform sampler2D uImage;\n' + + 'uniform vec4 uColor;\n' + + 'varying vec2 vTexCoord;\n' + + 'varying vec2 vTexCoord2;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + + 'color.rgba *= color2.rgba;\n' + + 'gl_FragColor = color;\n' + + '}', + mask: 'precision highp float;\n' + + 'uniform sampler2D uTexture;\n' + + 'uniform sampler2D uImage;\n' + + 'uniform vec4 uColor;\n' + + 'varying vec2 vTexCoord;\n' + + 'varying vec2 vTexCoord2;\n' + + 'void main() {\n' + + 'vec4 color = texture2D(uTexture, vTexCoord);\n' + + 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + + 'color.a = color2.a;\n' + + 'gl_FragColor = color;\n' + + '}', + }, + + /** + * Retrieves the cached shader. + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + retrieveShader: function(options) { + var cacheKey = this.type + '_' + this.mode; + var shaderSource = this.fragmentSource[this.mode]; + if (!options.programCache.hasOwnProperty(cacheKey)) { + options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); + } + return options.programCache[cacheKey]; + }, + + applyToWebGL: function(options) { + // load texture to blend. + var gl = options.context, + texture = this.createTexture(options.filterBackend, this.image); + this.bindAdditionalTexture(gl, texture, gl.TEXTURE1); + this.callSuper('applyToWebGL', options); + this.unbindAdditionalTexture(gl, gl.TEXTURE1); + }, + + createTexture: function(backend, image) { + return backend.getCachedTexture(image.cacheKey, image._element); + }, + + /** + * Calculate a transformMatrix to adapt the image to blend over + * @param {Object} options + * @param {WebGLRenderingContext} options.context The GL context used for rendering. + * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. + */ + calculateMatrix: function() { + var image = this.image, + width = image._element.width, + height = image._element.height; + return [ + 1 / image.scaleX, 0, 0, + 0, 1 / image.scaleY, 0, + -image.left / width, -image.top / height, 1 + ]; + }, + + /** + * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. + * + * @param {Object} options + * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. + */ + applyTo2d: function(options) { + var imageData = options.imageData, + resources = options.filterBackend.resources, + data = imageData.data, iLen = data.length, + width = options.imageData.width, + height = options.imageData.height, + tr, tg, tb, ta, + r, g, b, a, + canvas1, context, image = this.image, blendData; + + if (!resources.blendImage) { + resources.blendImage = document.createElement('canvas'); + } + canvas1 = resources.blendImage; + if (canvas1.width !== width || canvas1.height !== height) { + canvas1.width = width; + canvas1.height = height; + } + context = canvas1.getContext('2d'); + context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top); + context.drawImage(image._element, 0, 0, width, height); + blendData = context.getImageData(0, 0, width, height).data; + for (var i = 0; i < iLen; i += 4) { + + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + a = data[i + 3]; + + tr = blendData[i]; + tg = blendData[i + 1]; + tb = blendData[i + 2]; + ta = blendData[i + 3]; + + switch (this.mode) { + case 'multiply': + data[i] = r * tr / 255; + data[i + 1] = g * tg / 255; + data[i + 2] = b * tb / 255; + data[i + 3] = a * ta / 255; + break; + case 'mask': + data[i + 3] = ta; + break; + } + } + }, + + /** + * Return WebGL uniform locations for this filter's shader. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {WebGLShaderProgram} program This filter's compiled shader program. + */ + getUniformLocations: function(gl, program) { + return { + uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'), + uImage: gl.getUniformLocation(program, 'uImage'), + }; + }, + + /** + * Send data from this filter to its shader program's uniforms. + * + * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. + * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects + */ + sendUniformData: function(gl, uniformLocations) { + var matrix = this.calculateMatrix(); + gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1. + gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix); + }, + + /** + * Returns object representation of an instance + * @return {Object} Object representation of an instance + */ + toObject: function() { + return { + type: this.type, + image: this.image && this.image.toObject(), + mode: this.mode, + alpha: this.alpha + }; + } + }); + + /** + * Returns filter instance from an object representation + * @static + * @param {Object} object Object to create an instance from + * @param {function} callback to be invoked after filter creation + * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage + */ + fabric.Image.filters.BlendImage.fromObject = function(object, callback) { + fabric.Image.fromObject(object.image, function(image) { + var options = fabric.util.object.clone(object); + options.image = image; + callback(new fabric.Image.filters.BlendImage(options)); + }); + }; + +})(typeof exports !== 'undefined' ? exports : this); + + (function(global) { 'use strict'; @@ -21690,7 +22075,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { ratioWHalf = ceil(ratioW / 2), ratioHHalf = ceil(ratioH / 2), img = options.imageData, data = img.data, - img2 = options.ctx.createimageData(dW, dH), data2 = img2.data; + img2 = options.ctx.createImageData(dW, dH), data2 = img2.data; for (var j = 0; j < dH; j++) { for (var i = 0; i < dW; i++) { var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0, @@ -22089,7 +22474,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { }, simpleBlur: function(options) { - var resources = fabric.filterBackend.resources, canvas1, canvas2, + var resources = options.filterBackend.resources, canvas1, canvas2, width = options.imageData.width, height = options.imageData.height; @@ -23077,7 +23462,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { fabric.charWidthsCache[fontFamily] = { }; } var cache = fabric.charWidthsCache[fontFamily], - cacheProp = decl.fontStyle.toLowerCase() + '_' + decl.fontWeight.toLowerCase(); + cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase(); if (!cache[cacheProp]) { cache[cacheProp] = { }; } @@ -25597,9 +25982,9 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot this.hiddenTextarea.setAttribute('autocomplete', 'off'); this.hiddenTextarea.setAttribute('spellcheck', 'false'); this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', ''); - + this.hiddenTextarea.setAttribute('wrap', 'off'); var style = this._calcTextareaPosition(); - this.hiddenTextarea.style.cssText = 'white-space: nowrap; position: absolute; top: ' + style.top + + this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top + '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' + ' line-height: 1px; paddingーtop: ' + style.fontSize + ';'; fabric.document.body.appendChild(this.hiddenTextarea); @@ -26268,7 +26653,7 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot '\t\n', textAndBg.textBgRects.join(''), - '\t\t-1},complexity:function(){return this.getObjects().reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},fabric.CommonMethods={_setOptions:function(t){for(var e in t)this.set(e,t[e])},_initGradient:function(t,e){!t||!t.colorStops||t instanceof fabric.Gradient||this.set(e,new fabric.Gradient(t))},_initPattern:function(t,e,i){!t||!t.source||t instanceof fabric.Pattern?i&&i():this.set(e,new fabric.Pattern(t,i))},_initClipping:function(t){if(t.clipTo&&"string"==typeof t.clipTo){var e=fabric.util.getFunctionBody(t.clipTo);"undefined"!=typeof e&&(this.clipTo=new Function("ctx",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,e){this[t]=e},toggle:function(t){var e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this},get:function(t){return this[t]}},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;var i,r=e.split("."),n=r.length,s=t||fabric.window;for(i=0;ir;)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},createImage:function(){return fabric.document.createElement("img")},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);var n,s,o=!0,a=t.getImageData(e,i,2*r||1,2*r||1),h=a.data.length;for(n=3;n0?P-=2*f:1===c&&P<0&&(P+=2*f);for(var M=Math.ceil(Math.abs(P/f*2)),L=[],I=P/M,R=8/3*Math.sin(I/4)*Math.sin(I/4)/Math.sin(I/2),F=A+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,m,b,_=Math.sqrt,y=Math.min,x=Math.max,C=Math.abs,S=[],w=[[],[]];f=6*t-12*i+6*n,u=-3*t+9*i-9*n+3*h,d=3*i-3*t;for(var T=0;T<2;++T)if(T>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),C(u)<1e-12){if(C(f)<1e-12)continue;g=-d/f,0=e})}function i(t,e){return n(t,e,function(t,e){return t/g,">")}function r(t){for(var e,i=0,r=[],i=0;i57343)return t.charAt(e);if(55296<=i&&i<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";var r=t.charCodeAt(e+1);if(56320>r||r>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";var n=t.charCodeAt(e-1);if(55296>n||n>56319)throw"Low surrogate without preceding high surrogate";return!1}fabric.util.string={camelize:t,capitalize:e,escapeXml:i,graphemeSplit:r}}(),function(){function t(){}function e(t){for(var e=null,i=this;i.constructor.superclass;){var n=i.constructor.superclass.prototype[t];if(i[t]!==n){e=n;break}i=i.constructor.superclass.prototype}return e?arguments.length>1?e.apply(this,r.call(arguments,1)):e.call(this):console.log("tried to callSuper "+t+", method not found in prototype chain",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(c(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(t){}o||(h=function(t){for(var e=new Array(t.length),i=t.length;i--;)e[i]=t[i];return e});var c;c=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=c}(),function(){function t(t,e){return t+(/\?/.test(t)?"&":"?")+e}function e(){}function i(i,n){n||(n={});var s=n.method?n.method.toUpperCase():"GET",o=n.onComplete||function(){},a=r(),h=n.body||n.parameters;return a.onreadystatechange=function(){4===a.readyState&&(o(a),a.onreadystatechange=e)},"GET"===s&&(h=null,"string"==typeof n.parameters&&(i=t(i,n.parameters))),a.open(s,i,!0),"POST"!==s&&"PUT"!==s||a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.send(h),a}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(t){}}();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(){return!1}function e(e){i(function(r){e||(e={});var n,s=r||+new Date,o=e.duration||500,a=s+o,h=e.onChange||t,c=e.abort||t,l=e.onComplete||t,u=e.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},f="startValue"in e?e.startValue:0,d="endValue"in e?e.endValue:100,g=e.byValue||d-f;e.onStart&&e.onStart(),function t(r){if(c())return void l(d,1,1);n=r||+new Date;var p=n>a?o:n-s,v=p/o,m=u(p,f,g,o),b=Math.abs((m-f)/g);return h(m,b,v),n>a?void(e.onComplete&&e.onComplete()):void i(t)}(s)})}function i(){return r.apply(fabric.window,arguments)}var r=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=e,fabric.util.requestAnimFrame=i}(),function(){function t(t,e,i){var r="rgba("+parseInt(t[0]+i*(e[0]-t[0]),10)+","+parseInt(t[1]+i*(e[1]-t[1]),10)+","+parseInt(t[2]+i*(e[2]-t[2]),10);return r+=","+(t&&e?parseFloat(t[3]+i*(e[3]-t[3])):1),r+=")"}function e(e,i,r,n){var s=new fabric.Color(e).getSource(),o=new fabric.Color(i).getSource();n=n||{},fabric.util.animate(fabric.util.object.extend(n,{duration:r||500,startValue:s,endValue:o,byValue:o,easing:function(e,i,r,s){var o=n.colorEasing?n.colorEasing(e,s):1-Math.cos(e/s*(Math.PI/2));return t(i,r,o)}}))}fabric.util.animateColor=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)&&(x=" translate("+_(f)+" "+_(d)+") "),r=x+" matrix("+o+" 0 0 "+a+" "+h*o+" "+c*a+") ","svg"===t.nodeName){for(n=t.ownerDocument.createElement("g");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,e){for(;t&&(t=t.parentNode);)if(t.nodeName&&e.test(t.nodeName.replace("svg:",""))&&!t.getAttribute("instantiated_by_use"))return!0;return!1}var p=t.fabric||(t.fabric={}),v=p.util.object.extend,m=p.util.object.clone,b=p.util.toFixed,_=p.util.parseUnit,y=p.util.multiplyTransformMatrices,x=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i,C=/^(symbol|image|marker|pattern|view|svg)$/i,S=/^(?:pattern|defs|symbol|metadata|clipPath|mask)$/i,w=/^(symbol|g|a|svg)$/i,T={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",opacity:"opacity"},O={stroke:"strokeOpacity",fill:"fillOpacity"};p.cssRules={},p.gradientDefs={},p.parseTransformAttribute=function(){function t(t,e){var i=Math.cos(e[0]),r=Math.sin(e[0]),n=0,s=0;3===e.length&&(n=e[1],s=e[2]),t[0]=i,t[1]=r,t[2]=-r,t[3]=i,t[4]=n-(i*n-r*s),t[5]=s-(r*n+i*s)}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,i){t[i]=Math.tan(p.util.degreesToRadians(e[0]))}function r(t,e){t[4]=e[0],2===e.length&&(t[5]=e[1])}var n=[1,0,0,1,0,0],s=p.reNum,o="(?:\\s+,?\\s*|,\\s*)",a="(?:(skewX)\\s*\\(\\s*("+s+")\\s*\\))",h="(?:(skewY)\\s*\\(\\s*("+s+")\\s*\\))",c="(?:(rotate)\\s*\\(\\s*("+s+")(?:"+o+"("+s+")"+o+"("+s+"))?\\s*\\))",l="(?:(scale)\\s*\\(\\s*("+s+")(?:"+o+"("+s+"))?\\s*\\))",u="(?:(translate)\\s*\\(\\s*("+s+")(?:"+o+"("+s+"))?\\s*\\))",f="(?:(matrix)\\s*\\(\\s*("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")\\s*\\))",d="(?:"+f+"|"+u+"|"+l+"|"+c+"|"+a+"|"+h+")",g="(?:"+d+"(?:"+o+"*"+d+")*)",v="^\\s*(?:"+g+"?)\\s*$",m=new RegExp(v),b=new RegExp(d,"g");return function(s){var o=n.concat(),a=[];if(!s||s&&!m.test(s))return o;s.replace(b,function(s){var h=new RegExp(d).exec(s).filter(function(t){return!!t}),c=h[1],l=h.slice(2).map(parseFloat);switch(c){case"translate":r(o,l);break;case"rotate":l[0]=p.util.degreesToRadians(l[0]),t(o,l);break;case"scale":e(o,l);break;case"skewX":i(o,l,2);break;case"skewY":i(o,l,1);break;case"matrix":o=l}a.push(o.concat()),o=n.concat()});for(var h=a[0];a.length>1;)a.shift(),h=p.util.multiplyTransformMatrices(h,a[0]);return h}}();var k=new RegExp("^\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*$");p.parseSVGDocument=function(t,e,i,r){if(t){f(t);var n=p.Object.__uid++,s=d(t),o=p.util.toArray(t.getElementsByTagName("*"));if(s.crossOrigin=r&&r.crossOrigin,s.svgUid=n,0===o.length&&p.isLikelyNode){o=t.selectNodes('//*[name(.)!="svg"]');for(var a=[],h=0,c=o.length;h/i,""))),n&&n.documentElement||e&&e(null),p.parseSVGDocument(n.documentElement,function(t,i,r,n){e&&e(t,i,r,n)},i,r)}t=t.replace(/^\n\s*/,"").trim(),new p.util.request(t,{method:"get",onComplete:n})},loadSVGFromString:function(t,e,i,r){t=t.trim();var n;if("undefined"!=typeof DOMParser){var s=new DOMParser;s&&s.parseFromString&&(n=s.parseFromString(t,"text/xml"))}else p.window.ActiveXObject&&(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t.replace(//i,"")));p.parseSVGDocument(n.documentElement,function(t,i,r,n){e(t,i,r,n)},i,r)}})}("undefined"!=typeof exports?exports:this),fabric.ElementsParser=function(t,e,i,r,n){this.elements=t,this.callback=e,this.options=i,this.reviver=r,this.svgUid=i&&i.svgUid||0,this.parsingOptions=n},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"undefined"==typeof i&&(i=.5),i=Math.max(Math.min(1,i),0),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 this.lerp(t)},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){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new e(this.x,this.y)}}))}("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={constructor:e,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},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.appendPoint(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,s,o,a=new e,h=r.length,c=0;c0&&(a.status="Intersection"),a},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}var n=fabric.util.object.clone;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:parseFloat(e),color:i.toRgb(),opacity:i.getAlpha()})}return this},toObject:function(t){var e={type:this.type,coords:this.coords,colorStops:this.colorStops,offsetX:this.offsetX,offsetY:this.offsetY,gradientTransform:this.gradientTransform?this.gradientTransform.concat():this.gradientTransform};return fabric.util.populateWithProperties(this,e,t),e},toSVG:function(t){var e,i,r=n(this.coords,!0),s=n(this.colorStops,!0),o=r.r1>r.r2;s.sort(function(t,e){return t.offset-e.offset});for(var a in r)"x1"===a||"x2"===a?r[a]+=this.offsetX-t.width/2:"y1"!==a&&"y2"!==a||(r[a]+=this.offsetY-t.height/2);if(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']),"radial"===this.type){if(o){s=s.concat(),s.reverse();for(var h=0;h0)for(var l=Math.max(r.r1,r.r2),u=c/l,h=0;h\n')}return e.push("linear"===this.type?"\n":"\n"),e.join("")},toLive:function(t){var e,i=fabric.util.object.clone(this.coords);if(this.type){"linear"===this.type?e=t.createLinearGradient(i.x1,i.y1,i.x2,i.y2):"radial"===this.type&&(e=t.createRadialGradient(i.x1,i.y1,i.r1,i.x2,i.y2,i.r2));for(var r=0,n=this.colorStops.length;r\n\n\n'},setOptions:function(t){for(var e in t)this[e]=t[e]},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=fabric.util.transformPoint,s=fabric.util.invertTransform,o=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e||(e={}),this.renderAndResetBound=this.renderAndReset.bind(this),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:fabric.iMatrix.concat(),backgroundVpt:!0,overlayVpt:!0,onBeforeScaleRotate:function(){},enableRetinaScaling:!0,vptCoords:{},skipOffscreen:!0,_initStatic:function(t,e){var i=fabric.StaticCanvas.prototype.renderAll.bind(this);this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this._setImageSmoothing(),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1!==fabric.devicePixelRatio&&this.enableRetinaScaling},getRetinaScaling:function(){return this._isRetinaScaling()?fabric.devicePixelRatio:1},_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){return this[t]=e,this._initGradient(e,t),this._initPattern(e,t,i),this},_createCanvasElement:function(t){var e=fabric.util.createCanvasElement(t);if(e.style||(e.style={}),!e)throw o;if("undefined"==typeof e.getContext)throw o;return e},_initOptions:function(t){this._setOptions(t),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(t),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 this.viewportTransform[0]},setViewportTransform:function(t){var e,i=this._activeGroup,r=!1,n=!0;this.viewportTransform=t;for(var s=0,o=this._objects.length;s"),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","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),"\n")},createSVGRefElementsMarkup:function(){var t=this,e=["backgroundColor","overlayColor"].map(function(e){var i=t[e];if(i&&i.toLive)return i.toSVG(t,!1)});return e.join("")},createSVGFontFacesMarkup:function(){for(var t,e,i,r,n,s,o,a="",h={},c=fabric.fontPaths,l=this.getObjects(),u=0,f=l.length;u',"\n",a,"","\n"].join("")),a},_setSVGObjects:function(t,e){for(var i,r=0,n=this.getObjects(),s=n.length;r\n")}else t.push('\n")},sendToBack:function(t){if(!t)return this;var e,r,n,s=this._activeGroup;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(),this},bringToFront:function(t){if(!t)return this;var e,r,n,s=this._activeGroup;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._activeGroup;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(t){}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,e=this.canvas.getZoom();t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*e,t.shadowOffsetX=this.shadow.offsetX*e,t.shadowOffsetY=this.shadow.offsetY*e}},_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&&cs?t.x<0?t.x+=s:t.x-=s:t.x=0,n(t.y)>s?t.y<0?t.y+=s:t.y-=s: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),h=!0;if(n.target.snapAngle>0){var c=n.target.snapAngle,l=n.target.snapThreshold||c,u=Math.ceil(a/c)*c,f=Math.floor(a/c)*c;Math.abs(a-f)0?0:-i),e.ey-(r>0?0:-r),a,h)),this.selectionLineWidth&&this.selectionBorderColor)if(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,this.selectionDashArray.length>1&&!s){var c=e.ex+o-(i>0?0:a),l=e.ey+o-(r>0?0:h);t.beginPath(),fabric.util.drawDashedLine(t,c,l,c+a,l,this.selectionDashArray),fabric.util.drawDashedLine(t,c,l+h-1,c+a,l+h-1,this.selectionDashArray),fabric.util.drawDashedLine(t,c,l,c,l+h,this.selectionDashArray),fabric.util.drawDashedLine(t,c+a-1,l,c+a-1,l+h,this.selectionDashArray),t.closePath(),t.stroke()}else fabric.Object.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(e.ex+o-(i>0?0:a),e.ey+o-(r>0?0:h),a,h)},findTarget:function(t,e){if(!this.skipTargetFind){var i,r=!0,n=this.getPointer(t,r),s=this.getActiveGroup(),o=this.getActiveObject();if(this.targets=[],s&&!e&&s===this._searchPossibleTargets([s],n))return this._fireOverOutEvents(s,t),s;if(o&&o._findTargetCorner(n))return this._fireOverOutEvents(o,t),o;if(o&&o===this._searchPossibleTargets([o],n)){if(!this.preserveObjectStacking)return this._fireOverOutEvents(o,t),o;i=o}var a=this._searchPossibleTargets(this._objects,n);return t[this.altSelectionKey]&&a&&i&&a!==i&&(a=i),this._fireOverOutEvents(a,t),a}},_fireOverOutEvents:function(t,e){var i,r,n=this._hoveredTarget;n!==t&&(i={e:e,target:t,previousTarget:this._hoveredTarget},r={e:e,target:this._hoveredTarget,nextTarget:t},this._hoveredTarget=t),t?n!==t&&(n&&(this.fire("mouse:out",r),n.fire("mouseout",r)),this.fire("mouse:over",i),t.fire("mouseover",i)):n&&(this.fire("mouse:out",r),n.fire("mouseout",r))},_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},restorePointerVpt:function(t){return fabric.util.transformPoint(t,fabric.util.invertTransform(this.viewportTransform))},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=this.restorePointerVpt(s)),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.upperCanvasEl.className="":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.width+"px",height:this.height+"px",position:"relative"}),fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(t){var e=this.width||t.width,i=this.height||t.height;fabric.util.setStyle(t,{position:"absolute",width:e+"px",height:i+"px",left:0,top:0,"touch-action":"none"}),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){var e=this._activeObject;e&&(e.set("active",!1),t!==e&&e.onDeselect&&"function"==typeof e.onDeselect&&e.onDeselect()),this._activeObject=t,t.set("active",!0)},setActiveObject:function(t,e){var i=this.getActiveObject();return i&&i!==t&&i.fire("deselected",{e:e}),this._setActiveObject(t),this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e}),this.requestRenderAll(),this},getActiveObject:function(){return this._activeObject},_onObjectRemoved:function(t){this.getActiveObject()===t&&(this.fire("before:selection:cleared",{target:t}),this._discardActiveObject(),this.fire("selection:cleared",{target:t}),t.fire("deselected")),this._hoveredTarget===t&&(this._hoveredTarget=null),this.callSuper("_onObjectRemoved",t)},_discardActiveObject:function(){var t=this._activeObject;t&&(t.set("active",!1),t.onDeselect&&"function"==typeof t.onDeselect&&t.onDeselect()),this._activeObject=null},discardActiveObject:function(t){var e=this._activeObject;return e&&(this.fire("before:selection:cleared",{target:e,e:t}),this._discardActiveObject(),this.fire("selection:cleared",{e:t}),e.fire("deselected",{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){var e=this.getActiveGroup();return e&&(this.fire("before:selection:cleared",{e:t,target:e}),this._discardActiveGroup(),this.fire("selection:cleared",{e:t})),this},deactivateAll:function(){for(var t,e=this.getObjects(),i=0,r=e.length;i1)){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)}},__onMouseWheel:function(t){this._handleEvent(t,"wheel")},_transformObject:function(t){var e=this.getPointer(t),i=this._currentTransform;i.reset=!1,i.target.isMoving=!0,i.shiftKey=t.shiftKey,i.altKey=t[this.centeredKey],this._beforeScaleTransform(t,i),this._performTransformAction(t,i,e),i.actionPerformed&&this.requestRenderAll()},_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=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 this._isUniscalePossible(t,e.target)?(e.currentAction="scale",this._scaleObject(i,r)):(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally"))},_isUniscalePossible:function(t,e){return(t[this.uniScaleKey]||this.uniScaleTransform)&&!e.get("lockUniScaling")},_setCursorFromEvent:function(t,e){if(!e)return this.setCursor(this.defaultCursor),!1;var i=e.hoverCursor||this.hoverCursor,r=this.getActiveGroup(),n=e._findTargetCorner&&(!r||!r.contains(e))&&e._findTargetCorner(this.getPointer(t,!0));n?this.setCursor(this.getCornerCursor(n,e,t)):this.setCursor(i)},getCornerCursor:function(t,i,r){return this.actionIsDisabled(t,i,r)?this.notAllowedCursor:t in e?this._getRotatedCornerCursor(t,i,r):"mtr"===t&&i.hasRotatingPoint?this.rotationCursor:this.defaultCursor},actionIsDisabled:function(t,e,i){return"mt"===t||"mb"===t?i[this.altActionKey]?e.lockSkewingX:e.lockScalingY:"ml"===t||"mr"===t?i[this.altActionKey]?e.lockSkewingY:e.lockScalingX:"mtr"===t?e.lockRotation:this._isUniscalePossible(i,e)?e.lockScalingX&&e.lockScalingY:e.lockScalingX||e.lockScalingY},_getRotatedCornerCursor:function(t,i,r){var n=Math.round(i.angle%360/45);return n<0&&(n+=8),n+=e[t],r[this.altActionKey]&&e[t]%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))},_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),e)}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,e),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),this.fire("selection:created",{target:e,e:t}),this.requestRenderAll())},_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}})}(),function(){var t=fabric.StaticCanvas.supports("toDataURLWithQuality");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||0,top:t.top||0,width:t.width||0,height:t.height||0};return this.__toDataURLWithMultiplier(e,i,n,r)},__toDataURLWithMultiplier:function(t,e,i,r){var n=this.width,s=this.height,o=(i.width||this.width)*r,a=(i.height||this.height)*r,h=this.getZoom(),c=h*r,l=this.viewportTransform,u=(l[4]-i.left)*r,f=(l[5]-i.top)*r,d=[c,0,0,c,u,f],g=this.interactive;this.viewportTransform=d,this.interactive&&(this.interactive=!1),n!==o||s!==a?this.setDimensions({width:o,height:a}):this.renderAll();var p=this.__toDataURL(t,e,i);return g&&(this.interactive=g),this.viewportTransform=l,this.setDimensions({width:n,height:s}),p},__toDataURL:function(e,i){var r=this.contextContainer.canvas;"jpg"===e&&(e="jpeg");var n=t?r.toDataURL("image/"+e,i):r.toDataURL("image/"+e);return n},toDataURLWithMultiplier:function(t,e,i){return this.toDataURL({format:t,multiplier:e,quality:i})}})}(),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),n=this,s=this.renderOnAddRemove;return this.renderOnAddRemove=!1,this._enlivenObjects(r.objects,function(t){n.clear(),n._setBgOverlay(r,function(){t.forEach(function(t,e){n.insertAt(t,e)}),n.renderOnAddRemove=s,delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay,n._setOptions(r),n.renderAll(),e&&e()})},i),this}},_setBgOverlay:function(t,e){var i={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!(t.backgroundImage||t.overlayImage||t.background||t.overlay))return void(e&&e());var r=function(){i.backgroundImage&&i.overlayImage&&i.backgroundColor&&i.overlayColor&&e&&e()};this.__setBgOverlay("backgroundImage",t.backgroundImage,i,r),this.__setBgOverlay("overlayImage",t.overlayImage,i,r),this.__setBgOverlay("backgroundColor",t.background,i,r),this.__setBgOverlay("overlayColor",t.overlay,i,r)},__setBgOverlay:function(t,e,i,r){var n=this;return e?void("backgroundImage"===t||"overlayImage"===t?fabric.util.enlivenObjects([e],function(e){n[t]=e[0],i[t]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(t,!0)](e,function(){i[t]=!0,r&&r()})):(i[t]=!0,void(r&&r()))},_enlivenObjects:function(t,e,i){return t&&0!==t.length?void fabric.util.enlivenObjects(t,function(t){e&&e(t)},null,i):void(e&&e([]))},_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.width,e.height=this.height;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.object.clone,n=e.util.toFixed,s=e.util.string.capitalize,o=e.util.degreesToRadians,a=e.StaticCanvas.supports("setLineDash"),h=!e.isLikelyNode,c=2;e.Object||(e.Object=e.util.createClass(e.CommonMethods,{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,objectCaching:h,statefullCache:!1,noScaleCache:!0,dirty:!0,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill globalCompositeOperation shadow clipTo visible backgroundColor skewX skewY fillRule".split(" "),cacheProperties:"fill stroke strokeWidth strokeDashArray width height strokeLineCap strokeLineJoin strokeMiterLimit backgroundColor".split(" "),initialize:function(t){t=t||{},t&&this.setOptions(t)},_createCacheCanvas:function(){this._cacheProperties={},this._cacheCanvas=e.document.createElement("canvas"),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas()},_limitCacheSize:function(t){var i=e.perfLimitSizeTotal,r=e.cacheSideLimit,n=t.width,s=t.height,o=n/s,a=e.util.limitDimsByArea(o,i,r),h=e.util.capValue,c=e.maxCacheSideLimit,l=e.minCacheSideLimit,u=h(l,a.x,c),f=h(l,a.y,c);return n>u?(t.zoomX/=n/u,t.width=u):nf?(t.zoomY/=s/f,t.height=f):sg||s>p,m=(n<.9*g||s<.9*p)&&g>r&&p>r;d=v||m,v&&(u=.1*n&-2,f=.1*s&-2)}return!!l&&(d?(this._cacheCanvas.width=Math.max(Math.ceil(n)+u,r),this._cacheCanvas.height=Math.max(Math.ceil(s)+f,r),this.cacheTranslationX=(n+u)/2,this.cacheTranslationY=(s+f)/2):(this._cacheContext.setTransform(1,0,0,1,0,0),this._cacheContext.clearRect(0,0,this._cacheCanvas.width,this._cacheCanvas.height)),this.cacheWidth=n,this.cacheHeight=s,this._cacheContext.translate(this.cacheTranslationX,this.cacheTranslationY),this._cacheContext.scale(o,a),this.zoomX=o,this.zoomY=a,!0)},setOptions:function(t){this._setOptions(t),this._initGradient(t.fill,"fill"),this._initGradient(t.stroke,"stroke"),this._initClipping(t),this._initPattern(t.fill,"fill"),this._initPattern(t.stroke,"stroke")},transform:function(t,e){this.group&&!this.group._transformDone&&this.group.transform(t);var i=e?this._getLeftTopCoords():this.getCenterPoint();t.translate(i.x,i.y),this.angle&&t.rotate(o(this.angle)),t.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1)),this.skewX&&t.transform(1,0,Math.tan(o(this.skewX)),1,0,0),this.skewY&&t.transform(1,Math.tan(o(this.skewY)),0,1,0,0)},toObject:function(t){var i=e.Object.NUM_FRACTION_DIGITS,r={type:this.type,originX:this.originX,originY:this.originY,left:n(this.left,i),top:n(this.top,i),width:n(this.width,i),height:n(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:n(this.strokeWidth,i),strokeDashArray:this.strokeDashArray?this.strokeDashArray.concat():this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:n(this.strokeMiterLimit,i),scaleX:n(this.scaleX,i),scaleY:n(this.scaleY,i),angle:n(this.angle,i),flipX:this.flipX,flipY:this.flipY,opacity:n(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():null,skewX:n(this.skewX,i),skewY:n(this.skewY,i)};return e.util.populateWithProperties(this,r,t),this.includeDefaultValues||(r=this._removeDefaultValues(r)),r},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"#"},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}},getObjectOpacity:function(){var t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t},_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?"dirty"===t&&this.group&&this.group.set("dirty",i):i=new e.Shadow(i),this[t]=i,this.cacheProperties.indexOf(t)>-1&&(this.group&&this.group.set("dirty",!0),this.dirty=!0),this.group&&this.stateProperties.indexOf(t)>-1&&this.group.isOnACache()&&this.group.set("dirty",!0),"width"!==t&&"height"!==t||(this.minScaleLimit=Math.min(.1,1/Math.max(this.width,this.height))),this},setOnGroup:function(){},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:e.iMatrix.concat()},isNotVisible:function(){return 0===this.opacity||0===this.width&&0===this.height||!this.visible},render:function(t){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),this.transform(t),this._setOpacity(t),this._setShadow(t,this),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.clipTo&&e.util.clipContext(this,t),this.shouldCache()?(this._cacheCanvas||this._createCacheCanvas(),this.isCacheDirty()&&(this.statefullCache&&this.saveState({propertySet:"cacheProperties"}),this.drawObject(this._cacheContext),this.dirty=!1),this.drawCacheOnCanvas(t)):(this.dirty=!1,this.drawObject(t),this.objectCaching&&this.statefullCache&&this.saveState({propertySet:"cacheProperties"})),this.clipTo&&t.restore(),t.restore())},needsItsOwnCache:function(){return!1},shouldCache:function(){return this.ownCaching=this.objectCaching&&(!this.group||this.needsItsOwnCache()||!this.group.isOnACache()),this.ownCaching},willDrawShadow:function(){return!!this.shadow&&(0!==this.shadow.offsetX||0!==this.shadow.offsetY)},drawObject:function(t){this._renderBackground(t),this._setStrokeStyles(t,this),this._setFillStyles(t,this),this._render(t)},drawCacheOnCanvas:function(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)},isCacheDirty:function(t){if(this.isNotVisible())return!1;if(this._cacheCanvas&&!t&&this._updateCacheCanvas())return!0;if(this.dirty||this.statefullCache&&this.hasStateChanged("cacheProperties")){if(this._cacheCanvas&&!t){var e=this.cacheWidth/this.zoomX,i=this.cacheHeight/this.zoomY;this._cacheContext.clearRect(-e/2,-i/2,e,i)}return!0}return!1},_renderBackground:function(t){if(this.backgroundColor){var e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}},_setOpacity:function(t){this.group&&!this.group.transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity},_setStrokeStyles:function(t,e){e.stroke&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,t.strokeStyle=e.stroke.toLive?e.stroke.toLive(t,this):e.stroke)},_setFillStyles:function(t,e){e.fill&&(t.fillStyle=e.fill.toLive?e.fill.toLive(t,this):e.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),a?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){var r,n,s,a=this.getViewportTransform(),h=this.calcTransformMatrix();i=i||{},n="undefined"!=typeof i.hasBorders?i.hasBorders:this.hasBorders,s="undefined"!=typeof i.hasControls?i.hasControls:this.hasControls,h=e.util.multiplyTransformMatrices(a,h),r=e.util.qrDecompose(h),t.save(),t.translate(r.translateX,r.translateY),t.lineWidth=1*this.borderScaleFactor,this.group||(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),this.group&&this.group===this.canvas.getActiveGroup()?(t.rotate(o(r.angle)),n&&this.drawBordersInGroup(t,r,i)):(t.rotate(o(this.angle)),n&&this.drawBorders(t,i)),s&&this.drawControls(t,i),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)},_applyPatternGradientTransform:function(t,e){if(e.toLive){var i=e.gradientTransform||e.patternTransform,r=-this.width/2+e.offsetX||0,n=-this.height/2+e.offsetY||0;t.translate(r,n),i&&t.transform.apply(t,i)}},_renderFill:function(t){this.fill&&(t.save(),this._applyPatternGradientTransform(t,this.fill),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())},_renderStroke:function(t){this.stroke&&0!==this.strokeWidth&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray,this._renderDashedStroke),this._applyPatternGradientTransform(t,this.stroke),t.stroke(),t.restore())},_findCenterFromElement:function(){return{x:this.left+this.width/2,y:this.top+this.height/2}},_removeTransformMatrix:function(){var t=this._findCenterFromElement();if(this.transformMatrix){var i=e.util.qrDecompose(this.transformMatrix);this.flipX=!1,this.flipY=!1,this.set("scaleX",i.scaleX),this.set("scaleY",i.scaleY),this.angle=i.angle,this.skewX=i.skewX,this.skewY=0,t=e.util.transformPoint(t,this.transformMatrix)}this.transformMatrix=null,this.setPositionByOrigin(t,"center","center")},clone:function(t,i){var r=this.toObject(i);this.constructor.fromObject?this.constructor.fromObject(r,t):e.Object._fromObject("Object",r,t)},cloneAsImage:function(t,i){var r=this.toDataURL(i);return e.util.loadImage(r,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,{enableRetinaScaling:t.enableRetinaScaling});"jpg"===t.format&&(t.format="jpeg"),"jpeg"===t.format&&(n.backgroundColor="#fff");var s={active:this.active,left:this.left,top:this.top};this.set("active",!1),this.setPositionByOrigin(new e.Point(n.width/2,n.height/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 1},toJSON:function(t){return this.toObject(t)},setGradient:function(t,i){i||(i={});var r={colorStops:[]};return 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),r.gradientTransform=i.gradientTransform,e.Gradient.prototype.addColorStop.call(r,i.colorStops),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,o(-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.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._fromObject=function(t,i,n,s){var o=e[t];i=r(i,!0),e.util.enlivenPatterns([i.fill,i.stroke],function(t){"undefined"!=typeof t[0]&&(i.fill=t[0]),"undefined"!=typeof t[1]&&(i.stroke=t[1]);var e=s?new o(i[s],i):new o(i);n&&n(e)})},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.getScaledWidth(),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")},onDeselect:function(){}})}(),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,aCoords:null,getCoords:function(e,i){this.oCoords||this.setCoords();var r=e?this.aCoords:this.oCoords;return t(i?this.calcCoords(e):r)},intersectsWithRect:function(t,e,i,r){var n=this.getCoords(i,r),s=fabric.Intersection.intersectPolygonRectangle(n,t,e);return"Intersection"===s.status},intersectsWithObject:function(t,e,i){var r=fabric.Intersection.intersectPolygonPolygon(this.getCoords(e,i),t.getCoords(e,i));return"Intersection"===r.status||t.isContainedWithinObject(this,e,i)||this.isContainedWithinObject(t,e,i)},isContainedWithinObject:function(t,e,i){for(var r=this.getCoords(e,i),n=0,s=t._getImageLines(i?t.calcCoords(e):e?t.aCoords:t.oCoords);n<4;n++)if(!t.containsPoint(r[n],s))return!1;return!0},isContainedWithinRect:function(t,e,i,r){var n=this.getBoundingRect(i,r);return n.left>=t.x&&n.left+n.width<=e.x&&n.top>=t.y&&n.top+n.height<=e.y},containsPoint:function(t,e,i,r){var e=e||this._getImageLines(r?this.calcCoords(i):i?this.aCoords:this.oCoords),n=this._findCrossPoints(t,e);return 0!==n&&n%2===1},isOnScreen:function(t){if(!this.canvas)return!1;for(var e,i=this.canvas.vptCoords.tl,r=this.canvas.vptCoords.br,n=this.getCoords(!0,t),s=0;s<4;s++)if(e=n[s],e.x<=r.x&&e.x>=i.x&&e.y<=r.y&&e.y>=i.y)return!0;if(this.intersectsWithRect(i,r,!0))return!0;var o={x:(i.x+r.x)/2,y:(i.y+r.y)/2};return!!this.containsPoint(o,null,!0)},_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=0;for(var c in e)if(a=e[c],!(a.o.y=t.y&&a.d.y>=t.y||(a.o.x===a.d.x&&a.o.x>=t.x?o=a.o.x:(i=0,r=(a.d.y-a.o.y)/(a.d.x-a.o.x),n=t.y-i*t.x,s=a.o.y-r*a.o.x,o=-(n-s)/(i-r)),o>=t.x&&(h+=1),2!==h)))break;return h},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(t,e){var i=this.getCoords(t,e);return fabric.util.makeBoundingBoxFromPoints(i)},getScaledWidth:function(){return this._getTransformedDimensions().x},getScaledHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)0?Math.atan(o/s):0,l=s/Math.cos(c)/2,u=Math.cos(c+i)*l,f=Math.sin(c+i)*l,d=this.getCenterPoint(),g=t?d:fabric.util.transformPoint(d,r),p=new fabric.Point(g.x-u,g.y-f),v=new fabric.Point(p.x+s*h,p.y+s*a),m=new fabric.Point(p.x-o*a,p.y+o*h),b=new fabric.Point(g.x+u,g.y+f);if(!t)var _=new fabric.Point((p.x+m.x)/2,(p.y+m.y)/2),y=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point((b.x+v.x)/2,(b.y+v.y)/2),C=new fabric.Point((b.x+m.x)/2,(b.y+m.y)/2),S=new fabric.Point(y.x+a*this.rotatingPointOffset,y.y-h*this.rotatingPointOffset);var g={tl:p,tr:v,br:b,bl:m};return t||(g.ml=_,g.mt=y,g.mr=x,g.mb=C,g.mtr=S),g},setCoords:function(t,e){return this.oCoords=this.calcCoords(t),e||(this.aCoords=this.calcCoords(!0)),t||this._setCornerCoords&&this._setCornerCoords(),this},_calcRotateMatrix:function(){if(this.angle){var t=e(this.angle),i=Math.cos(t),r=Math.sin(t);return 6.123233995736766e-17!==i&&i!==-1.8369701987210297e-16||(i=0),[i,r,-r,i,0,0]}return fabric.iMatrix.concat()},calcTransformMatrix:function(t){var e=this.getCenterPoint(),r=[1,0,0,1,e.x,e.y],n=this._calcRotateMatrix(),s=this._calcDimensionsTransformMatrix(this.skewX,this.skewY,!0),o=this.group&&!t?this.group.calcTransformMatrix():fabric.iMatrix.concat();return o=i(o,r),o=i(o,n),o=i(o,s)},_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)},_getNonTransformedDimensions:function(){var t=this.strokeWidth,e=this.width+t,i=this.height+t;return{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')},_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}})}(),function(){function t(t,e,r){var n={},s=!0;r.forEach(function(e){n[e]=t[e]}),i(t[e],n,s)}function e(t,i,r){if(t===i)return!0;if(Array.isArray(t)){if(t.length!==i.length)return!1;for(var n=0,s=t.length;n\n'),t?t(e.join("")):e.join("")}}),i.Line.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),i.Line.fromElement=function(t,e,n){n=n||{};var s=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),o=[s.x1||0,s.y1||0,s.x2||0,s.y2||0];n.originX="left",n.originY="top",e(new i.Line(o,r(s,n)))},i.Line.fromObject=function(t,e){function r(t){delete t.points,e&&e(t)}var s=n(t,!0);s.points=[t.x1,t.y1,t.x2,t.y2],i.Object._fromObject("Line",s,r,"points")}}("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;if(i.Circle)return void i.warn("fabric.Circle is already defined.");var s=i.Object.prototype.cacheProperties.concat();s.push("radius"),i.Circle=i.util.createClass(i.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*r,cacheProperties:s,initialize:function(t){this.callSuper("initialize",t),this.set("radius",t&&t.radius||0)},_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,n=0,s=(this.endAngle-this.startAngle)%(2*r);if(0===s)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){t.beginPath(),t.arc(0,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)}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r,s){s||(s={});var o=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(o))throw new Error("value of `r` attribute is required and can not be negative");o.left=(o.left||0)-o.radius,o.top=(o.top||0)-o.radius,o.originX="left",o.originY="top",r(new i.Circle(n(o,s)))},i.Circle.fromObject=function(t,e){return i.Object._fromObject("Circle",t,e)}}("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){this.callSuper("initialize",t),this.set("width",t&&t.width||100).set("height",t&&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("")}}),void(e.Triangle.fromObject=function(t,i){return e.Object._fromObject("Triangle",t,i)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=2*Math.PI,r=e.util.object.extend;if(e.Ellipse)return void e.warn("fabric.Ellipse is already defined.");var n=e.Object.prototype.cacheProperties.concat();n.push("rx","ry"),e.Ellipse=e.util.createClass(e.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:n,initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&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 this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,r=0;return e.push("\n'),t?t(e.join("")):e.join("")},_render:function(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,i,!1),t.restore(),this._renderFill(t),this._renderStroke(t)}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i,n){n||(n={});var s=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);s.left=(s.left||0)-s.rx,s.top=(s.top||0)-s.ry,s.originX="left",s.originY="top",i(new e.Ellipse(r(s,n)))},e.Ellipse.fromObject=function(t,i){return e.Object._fromObject("Ellipse",t,i)}}("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");var n=e.Object.prototype.cacheProperties.concat();n.push("rx","ry"),e.Rect=e.util.createClass(e.Object,{stateProperties:r,type:"rect",rx:0,ry:0,cacheProperties:n,initialize:function(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){if(1===this.width&&1===this.height)return void t.fillRect(-.5,-.5,1,1);var e=this.rx?Math.min(this.rx,this.width/2):0,i=this.ry?Math.min(this.ry,this.height/2):0,r=this.width,n=this.height,s=-this.width/2,o=-this.height/2,a=0!==e||0!==i,h=.4477152502;t.beginPath(),t.moveTo(s+e,o),t.lineTo(s+r-e,o),a&&t.bezierCurveTo(s+r-h*e,o,s+r,o+h*i,s+r,o+i),t.lineTo(s+r,o+n-i),a&&t.bezierCurveTo(s+r,o+n-h*i,s+r-h*e,o+n,s+r-e,o+n),t.lineTo(s+e,o+n),a&&t.bezierCurveTo(s+h*e,o+n,s,o+n-h*i,s,o+n-i),t.lineTo(s,o+i),a&&t.bezierCurveTo(s,o+h*i,s+h*e,o,s+e,o),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){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=-this.width/2,r=-this.height/2;return e.push("\n'),t?t(e.join("")):e.join("")}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r,n){if(!t)return r(null);n=n||{};var s=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);s.left=s.left||0,s.top=s.top||0,s.originX="left",s.originY="top";var o=new e.Rect(i(n?e.util.object.clone(n):{},s));o.visible=o.visible&&o.width>0&&o.height>0,r(o)},e.Rect.fromObject=function(t,i){return e.Object._fromObject("Rect",t,i)}}("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.toFixed,o=e.Object.NUM_FRACTION_DIGITS;if(e.Polyline)return void e.warn("fabric.Polyline is already defined");var a=e.Object.prototype.cacheProperties.concat();a.push("points"),e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,minX:0,minY:0,cacheProperties:a,initialize:function(t,e){e=e||{},this.points=t||[],this.callSuper("initialize",e),this._calcDimensions(),"top"in e||(this.top=this.minY),"left"in e||(this.left=this.minX),this.pathOffset={x:this.minX+this.width/2,y:this.minY+this.height/2}},_calcDimensions:function(){var t=this.points,e=r(t,"x"),i=r(t,"y"),s=n(t,"x"),o=n(t,"y");this.width=s-e||0,this.height=o-i||0,this.minX=e||0,this.minY=i||0},toObject:function(t){return i(this.callSuper("toObject",t),{points:this.points.concat()})},toSVG:function(t){for(var e=[],i=this.pathOffset.x,r=this.pathOffset.y,n=this._createBaseSVGMarkup(),a=0,h=this.points.length;a\n'),t?t(n.join("")):n.join("")},commonRender:function(t){var e,i=this.points.length,r=this.pathOffset.x,n=this.pathOffset.y;if(!i||isNaN(this.points[i-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-r,this.points[0].y-n);for(var s=0;s"},toObject:function(t){var e=n(this.callSuper("toObject",["sourcePath","pathOffset"].concat(t)),{path:this.path.map(function(t){return t.slice()}),top:this.top,left:this.left});return 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 m=1,b=n.length;m"},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.setCoords(),this.dirty=!0,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.setCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){this.dirty=!0,delete t.group,t.set("active",!1)},_set:function(t,e){var i=this._objects.length;if("canvas"===t)for(;i--;)this._objects[i].set(t,e);if(this.useSetOnGroup)for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){var e=this.getObjects().map(function(e){var i=e.includeDefaultValues;e.includeDefaultValues=e.group.includeDefaultValues;var r=e.toObject(t);return e.includeDefaultValues=i,r});return i(this.callSuper("toObject",t),{objects:e})},toDatalessObject:function(t){var e,r=this.sourcePath;return e=r?r:this.getObjects().map(function(e){var i=e.includeDefaultValues;e.includeDefaultValues=e.group.includeDefaultValues;var r=e.toDatalessObject(t);return e.includeDefaultValues=i,r}),i(this.callSuper("toDatalessObject",t),{objects:e})},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},shouldCache:function(){var t=this.objectCaching&&(!this.group||this.needsItsOwnCache()||!this.group.isOnACache());if(this.ownCaching=t,t)for(var e=0,i=this._objects.length;e\n');for(var i=0,r=this._objects.length;i\n"),t?t(e.join("")):e.join("")}}),e.Group.fromObject=function(t,i){e.util.enlivenObjects(t.objects,function(r){delete t.objects,i&&i(new e.Group(r,t,!0))})})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=fabric.util.object.extend;if(t.fabric||(t.fabric={}),t.fabric.Image)return void fabric.warn("fabric.Image is already defined.");var i=fabric.Object.prototype.stateProperties.concat();i.push("cropX","cropY"),fabric.Image=fabric.util.createClass(fabric.Object,{type:"image",crossOrigin:"",strokeWidth:0,_lastScaleX:1,_lastScaleY:1,_filterScalingX:1,_filterScalingY:1,minimumScaleTrigger:.5,stateProperties:i,objectCaching:!1,cacheKey:"",cropX:0,cropY:0,initialize:function(t,e){e||(e={}),this.filters=[],this.callSuper("initialize",e),this._initElement(t,e),this.cacheKey="texture"+fabric.Object.__uid++},getElement:function(){return this._element},setElement:function(t,e){return this._element=t,this._originalElement=t,this._initConfig(e),this.resizeFilter&&this.applyResizeFilters(),0!==this.filters.length&&this.applyFilters(),this},setCrossOrigin:function(t){return this.crossOrigin=t,this._element.crossOrigin=t,this},getOriginalSize:function(){var t=this.getElement();return{width:t.width,height:t.height}},_stroke:function(t){if(this.stroke&&0!==this.strokeWidth){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,-i),t.lineTo(e,-i),t.lineTo(e,i),t.lineTo(-e,i),t.lineTo(-e,-i),t.closePath()}},_renderDashedStroke:function(t){var e=-this.width/2,i=-this.height/2,r=this.width,n=this.height;t.save(),this._setStrokeStyles(t,this),t.beginPath(),fabric.util.drawDashedLine(t,e,i,e+r,i,this.strokeDashArray),fabric.util.drawDashedLine(t,e+r,i,e+r,i+n,this.strokeDashArray),fabric.util.drawDashedLine(t,e+r,i+n,e,i+n,this.strokeDashArray),fabric.util.drawDashedLine(t,e,i+n,e,i,this.strokeDashArray),t.closePath(),t.restore()},toObject:function(t){var i=[];this.filters.forEach(function(t){t&&i.push(t.toObject())});var r=e(this.callSuper("toObject",["crossOrigin","cropX","cropY"].concat(t)),{src:this.getSrc(),filters:i});return this.resizeFilter&&(r.resizeFilter=this.resizeFilter.toObject()),r.width/=this._filterScalingX,r.height/=this._filterScalingY,r},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=-this.width/2,r=-this.height/2,n=!0;if(e.push('\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(t){var e=t?this._element:this._originalElement;return e?fabric.isLikelyNode?e._src:e.src:this.src||""},setSrc:function(t,e,i){return fabric.util.loadImage(t,function(t){this.setElement(t,i),e(this)},this,i&&i.crossOrigin),this},toString:function(){return'#'},applyResizeFilters:function(){var t=this.resizeFilter,e=this.canvas?this.canvas.getRetinaScaling():1,i=this.minimumScaleTrigger,r=this.scaleX=1&&n>=1)return void(this._element=this._filteredEl);fabric.filterBackend||(fabric.filterBackend=fabric.initFilterBackend());var s,o=this._filteredEl||this._originalElement;if(this._element===this._originalElement){var a=fabric.util.createCanvasElement();a.width=o.width,a.height=o.height,this._element=a}var h=this._element.getContext("2d");o.getContext?s=o.getContext("2d").getImageData(0,0,o.width,o.height):(h.drawImage(o,0,0),s=h.getImageData(0,0,o.width,o.height));var c={imageData:s,scaleX:r,scaleY:n};t.applyTo2d(c),this.width=this._element.width=c.imageData.width,this.height=this._element.height=c.imageData.height,h.putImageData(c.imageData,0,0)},applyFilters:function(t){if(t=t||this.filters||[],t=t.filter(function(t){return t}),0===t.length)return this._element=this._originalElement,this._filterScalingX=1,this._filterScalingY=1,this;var e=this._originalElement,i=e.naturalWidth||e.width,r=e.naturalHeight||e.height;if(this._element===this._originalElement){var n=fabric.util.createCanvasElement();n.width=e.width,n.height=e.height,this._element=n}else this._element.getContext("2d").clearRect(0,0,i,r);return fabric.filterBackend||(fabric.filterBackend=fabric.initFilterBackend()),fabric.filterBackend.applyFilters(t,this._originalElement,i,r,this._element,this.cacheKey),this.width===this._element.width&&this.height===this._element.height||(this._filterScalingX=this._element.width/this.width,this._filterScalingY=this._element.height/this.height,this.width=this._element.width,this.height=this._element.height),this},_render:function(t){var e,i=-this.width/2,r=-this.height/2;this.isMoving===!1&&this.resizeFilter&&this._needsResize()&&(this._lastScaleX=this.scaleX,this._lastScaleY=this.scaleY,this.applyResizeFilters()),e=this._element,e&&t.drawImage(e,this.cropX,this.cropY,this.width,this.height,i,r,this.width,this.height),this._stroke(t),this._renderStroke(t)},_needsResize:function(){return this.scaleX!==this._lastScaleX||this.scaleY!==this._lastScaleY},_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),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},parsePreserveAspectRatioAttribute:function(){if(this.preserveAspectRatio){var t,e=fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio),i=this._element.width,r=this._element.height,n=this.width,s=this.height,o={width:n,height:s};!e||"none"===e.alignX&&"none"===e.alignY?(this.scaleX=n/i,this.scaleY=s/r):("meet"===e.meetOrSlice&&(this.width=i,this.height=r,this.scaleX=this.scaleY=t=fabric.util.findScaleToFit(this._element,o),"Mid"===e.alignX&&(this.left+=(n-i*t)/2),"Max"===e.alignX&&(this.left+=n-i*t),"Mid"===e.alignY&&(this.top+=(s-r*t)/2),"Max"===e.alignY&&(this.top+=s-r*t)),"slice"===e.meetOrSlice&&(this.scaleX=this.scaleY=t=fabric.util.findScaleToCover(this._element,o),this.width=n/t,this.height=s/t,"Mid"===e.alignX&&(this.cropX=(i-this.width)/2),"Max"===e.alignX&&(this.cropX=i-this.width),"Mid"===e.alignY&&(this.cropY=(r-this.height)/2),"Max"===e.alignY&&(this.cropY=r-this.height)))}}}),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,r){return r?void(e&&e(null,r)):void fabric.Image.prototype._initFilters.call(t,t.filters,function(r){t.filters=r||[],fabric.Image.prototype._initFilters.call(t,[t.resizeFilter],function(r){t.resizeFilter=r[0];var n=new fabric.Image(i,t);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 crossOrigin".split(" ")),fabric.Image.fromElement=function(t,i,r){var n=fabric.parseAttributes(t,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(n["xlink:href"],i,e(r?fabric.util.object.clone(r):{},n))}}("undefined"!=typeof exports?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var t=this.angle%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}}),function(){"use strict";function t(t){t&&t.tileSize&&(this.tileSize=t.tileSize),this.setupGLContext(this.tileSize,this.tileSize),this.captureGPUInfo()}fabric.isWebglSupported=function(t){if(fabric.isLikelyNode)return!1;t=t||fabric.WebglFilterBackend.prototype.tileSize;var e=document.createElement("canvas"),i=e.getContext("webgl")||e.getContext("experimental-webgl"),r=!1;return i&&(fabric.maxTextureSize=i.getParameter(i.MAX_TEXTURE_SIZE),r=fabric.maxTextureSize>=t),this.isSupported=r,r},fabric.WebglFilterBackend=t,t.prototype={tileSize:2048,resources:{},setupGLContext:function(t,e){this.dispose(),this.createWebGLCanvas(t,e),this.squareVertices=new Float32Array([0,0,0,1,1,0,1,1])},createWebGLCanvas:function(t,e){var i=fabric.util.createCanvasElement();i.width=t,i.height=e;var r={premultipliedAlpha:!1},n=i.getContext("webgl",r);n||(n=i.getContext("experimental-webgl",r)),n&&(n.clearColor(0,0,0,0),this.canvas=i,this.gl=n)},applyFilters:function(t,e,i,r,n,s){var o,a=this.gl;s&&(o=this.getCachedTexture(s,e));var h={originalWidth:e.width||e.originalWidth,originalHeight:e.height||e.originalHeight,sourceWidth:i,sourceHeight:r,context:a,sourceTexture:this.createTexture(a,i,r,!o&&e),targetTexture:this.createTexture(a,i,r),originalTexture:o||this.createTexture(a,i,r,!o&&e),passes:t.length,webgl:!0,squareVertices:this.squareVertices,programCache:this.programCache,pass:0},c=a.createFramebuffer();return a.bindFramebuffer(a.FRAMEBUFFER,c),t.forEach(function(t){t&&t.applyTo(h)}),this.copyGLTo2D(a.canvas,n),a.bindTexture(a.TEXTURE_2D,null),a.deleteTexture(h.sourceTexture),a.deleteTexture(h.targetTexture),a.deleteFramebuffer(c),n.getContext("2d").setTransform(1,0,0,1,0,0),h},applyFiltersDebug:function(t,e,i,r,n,s){var o=this.gl,a=this.applyFilters(t,e,i,r,n,s),h=o.getError();if(h!==o.NO_ERROR){var c=this.glErrorToString(o,h),l=new Error("WebGL Error "+c);throw l.glErrorCode=h,l}return a},glErrorToString:function(t,e){if(!t)return"Context undefined for error code: "+e;if("number"!=typeof e)return"Error code is not a number";switch(e){case t.NO_ERROR:return"NO_ERROR";case t.INVALID_ENUM:return"INVALID_ENUM";case t.INVALID_VALUE:return"INVALID_VALUE";case t.INVALID_OPERATION:return"INVALID_OPERATION";case t.INVALID_FRAMEBUFFER_OPERATION:return"INVALID_FRAMEBUFFER_OPERATION";case t.OUT_OF_MEMORY:return"OUT_OF_MEMORY";case t.CONTEXT_LOST_WEBGL:return"CONTEXT_LOST_WEBGL";default:return"UNKNOWN_ERROR"}},dispose:function(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()},clearWebGLCaches:function(){this.programCache={},this.textureCache={}},createTexture:function(t,e,i,r){var n=t.createTexture();return t.bindTexture(t.TEXTURE_2D,n),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),r?t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,r):t.texImage2D(t.TEXTURE_2D,0,t.RGBA,e,i,0,t.RGBA,t.UNSIGNED_BYTE,null),n},getCachedTexture:function(t,e){if(this.textureCache[t])return this.textureCache[t];var i=this.createTexture(this.gl,e.width,e.height,e);return this.textureCache[t]=i,i},copyGLTo2D:function(t,e){var i=e.getContext("2d");i.translate(0,e.height),i.scale(1,-1);var r=t.height-e.height;i.drawImage(t,0,r,e.width,e.height,0,0,e.width,e.height)},evictCachesForKey:function(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])},captureGPUInfo:function(){if(this.gpuInfo)return this.gpuInfo;var t=this.gl,e=t.getExtension("WEBGL_debug_renderer_info"),i={renderer:"",vendor:""};if(e){var r=t.getParameter(e.UNMASKED_RENDERER_WEBGL),n=t.getParameter(e.UNMASKED_VENDOR_WEBGL);r&&(i.renderer=r.toLowerCase()),n&&(i.vendor=n.toLowerCase())}return this.gpuInfo=i,i}}}(),function(){"use strict";function t(){}var e=function(){};fabric.Canvas2dFilterBackend=t,t.prototype={evictCachesForKey:e,dispose:e,clearWebGLCaches:e,resources:{},applyFilters:function(t,e,i,r,n){var s=n.getContext("2d");s.drawImage(e,0,0,i,r);var o=s.getImageData(0,0,i,r),a=s.getImageData(0,0,i,r),h={sourceWidth:i,sourceHeight:r,imageData:o,originalEl:e,originalImageData:a,canvasEl:n,ctx:s};return t.forEach(function(t){t.applyTo(h)}),h.imageData.width===i&&h.imageData.height===r||(n.width=h.imageData.width,n.height=h.imageData.height),s.putImageData(h.imageData,0,0),h}}}(),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",vertexSource:"attribute vec2 aPosition;\nattribute vec2 aTexCoord;\nvarying vec2 vTexCoord;\nvoid main() {\nvTexCoord = aTexCoord;\ngl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n}",fragmentSource:"precision highp float;\nvarying vec2 vTexCoord;\nuniform sampler2d uTexture;\nvoid main() {\ngl_FragColor = texture2D(uTexture, vTexCoord);\n}",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},createProgram:function(t,e,i){if(this.vertexSource&&this.fragmentSource){var r=t.createShader(t.VERTEX_SHADER);if(t.shaderSource(r,i||this.vertexSource),t.compileShader(r),!t.getShaderParameter(r,t.COMPILE_STATUS))throw new Error('Vertex shader compile error for "${this.type}": '+t.getShaderInfoLog(r));var n=t.createShader(t.FRAGMENT_SHADER);if(t.shaderSource(n,e||this.fragmentSource),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new Error('Fragment shader compile error for "${this.type}": '+t.getShaderInfoLog(n));var s=t.createProgram();if(t.attachShader(s,r),t.attachShader(s,n),t.linkProgram(s),!t.getProgramParameter(s,t.LINK_STATUS))throw new Error('Shader link error for "${this.type}" '+t.getProgramInfoLog(s));var o=this.getAttributeLocations(t,s),a=this.getUniformLocations(t,s)||{};return a.uStepW=t.getUniformLocation(s,"uStepW"),a.uStepH=t.getUniformLocation(s,"uStepH"),{program:s,attributeLocations:o,uniformLocations:a}}},getAttributeLocations:function(t,e){return{aPosition:t.getAttribLocation(e,"aPosition"),aTexCoord:t.getAttribLocation(e,"aTexCoord")}},getUniformLocations:function(){},sendAttributeData:function(t,e,i){["aPosition","aTexCoord"].forEach(function(r){var n=e[r],s=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,s),t.enableVertexAttribArray(n),t.vertexAttribPointer(n,2,t.FLOAT,!1,0,0),t.bufferData(t.ARRAY_BUFFER,i,t.STATIC_DRAW)})},_setupFrameBuffer:function(t){var e=t.context;t.passes>1?e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0):(e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish())},_swapTextures:function(t){t.passes--,t.pass++;var e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e},isNeutralState:function(){return!1},applyTo:function(t){if(t.webgl){if(t.passes>1&&this.isNeutralState(t))return;this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)}else this.applyTo2d(t)},retrieveShader:function(t){return t.programCache.hasOwnProperty(this.type)||(t.programCache[this.type]=this.createProgram(t.context)),t.programCache[this.type]},applyToWebGL:function(t){var e=t.context,i=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(i.program),this.sendAttributeData(e,i.attributeLocations,t.squareVertices),e.uniform1f(i.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(i.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,i.uniformLocations),e.viewport(0,0,t.sourceWidth,t.sourceHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)},bindAdditionalTexture:function(t,e,i){t.activeTexture(i),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)},unbindAdditionalTexture:function(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)},getMainParameter:function(){return this[this.mainParameter]},setMainParameter:function(t){this[this.mainParameter]=t},sendUniformData:function(){},createHelpLayer:function(t){if(!t.helpLayer){var e=document.createElement("canvas");e.width=t.sourceWidth,e.height=t.sourceHeight,t.helpLayer=e}},toObject:function(){var t={type:this.type},e=this.mainParameter;return e&&(t[e]=this[e]),t},toJSON:function(){return this.toObject()}}),fabric.Image.filters.BaseFilter.fromObject=function(t,e){var i=new fabric.Image.filters[t.type](t);return e&&e(i),i},function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.ColorMatrix=r(i.BaseFilter,{type:"ColorMatrix",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nvarying vec2 vTexCoord;\nuniform mat4 uColorMatrix;\nuniform vec4 uConstants;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\ncolor *= uColorMatrix;\ncolor += uConstants;\ngl_FragColor = color;\n}",matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],mainParameter:"matrix",colorsOnly:!0,initialize:function(t){this.callSuper("initialize",t),this.matrix=this.matrix.slice(0)},applyTo2d:function(t){var e,i,r,n,s,o=t.imageData,a=o.data,h=a.length,c=this.matrix,l=this.colorsOnly;for(s=0;sy||o<0||o>_||(h=4*(a*_+o),c=v[d*m+f],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,S||(n+=p[h+3]*c));C[s]=e,C[s+1]=i,C[s+2]=r,S?C[s+3]=p[s+3]:C[s+3]=n}t.imageData=x},getUniformLocations:function(t,e){return{uMatrix:t.getUniformLocation(e,"uMatrix"),uOpaque:t.getUniformLocation(e,"uOpaque"),uHalfSize:t.getUniformLocation(e,"uHalfSize"),uSize:t.getUniformLocation(e,"uSize")}},sendUniformData:function(t,e){t.uniform1fv(e.uMatrix,this.matrix)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Grayscale=r(i.BaseFilter,{type:"Grayscale",fragmentSource:{average:"precision highp float;\nuniform sampler2D uTexture;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nfloat average = (color.r + color.b + color.g) / 3.0;\ngl_FragColor = vec4(average, average, average, color.a);\n}",lightness:"precision highp float;\nuniform sampler2D uTexture;\nuniform int uMode;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 col = texture2D(uTexture, vTexCoord);\nfloat average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\ngl_FragColor = vec4(average, average, average, col.a);\n}",luminosity:"precision highp float;\nuniform sampler2D uTexture;\nuniform int uMode;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 col = texture2D(uTexture, vTexCoord);\nfloat average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\ngl_FragColor = vec4(average, average, average, col.a);\n}"},mode:"average",mainParameter:"mode",applyTo2d:function(t){var e,i,r=t.imageData,n=r.data,s=n.length,o=this.mode;for(e=0;el[0]&&n>l[1]&&s>l[2]&&rt)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return a(e)*a(i)/e/i}}function f(t){var a,h,u,O,k,D,j,E,A,P,M;for(w.x=(t+.5)*m,T.x=r(w.x),a=0;a=e)){P=r(1e3*s(h-w.x)),S[P]||(S[P]={});for(var L=T.y-C;L<=T.y+C;L++)L<0||L>=o||(M=r(1e3*s(L-w.y)),S[P][M]||(S[P][M]=v(n(i(P*_,2)+i(M*y,2))/1e3)),u=S[P][M],u>0&&(O=4*(L*e+h),k+=u,D+=u*d[O],j+=u*d[O+1],E+=u*d[O+2],A+=u*d[O+3]))}O=4*(a*c+t),p[O]=D/k,p[O+1]=j/k,p[O+2]=E/k,p[O+3]=A/k}return++t1&&L<-1||(y=2*L*L*L-3*L*L+1,y>0&&(M=4*(P+D*e),O+=y*g[M+3],C+=y,g[M+3]<255&&(y=y*g[M+3]/250),S+=y*g[M],w+=y*g[M+1],T+=y*g[M+2],x+=y))}v[_]=S/x,v[_+1]=w/x,v[_+2]=T/x,v[_+3]=O/C}return p},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Contrast=r(i.BaseFilter,{type:"Contrast",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nuniform float uContrast;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nfloat contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\ncolor.rgb = contrastF * (color.rgb - 0.5) + 0.5;\ngl_FragColor = color;\n}",contrast:0,mainParameter:"contrast",applyTo2d:function(t){if(0!==this.contrast){var e,i,r=t.imageData,n=r.data,i=n.length,s=Math.floor(255*this.contrast),o=259*(s+255)/(255*(259-s));for(e=0;e1&&(e=1/this.aspectRatio):this.aspectRatio<1&&(e=this.aspectRatio),t=e*this.blur*.12,this.horizontal?i[0]=t:i[1]=t,i}}),i.Blur.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Gamma=r(i.BaseFilter,{type:"Gamma",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nuniform vec3 uGamma;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nvec3 correction = (1.0 / uGamma);\ncolor.r = pow(color.r, correction.r);\ncolor.g = pow(color.g, correction.g);\ncolor.b = pow(color.b, correction.b);\ngl_FragColor = color;\ngl_FragColor.rgb *= color.a;\n}",gamma:[1,1,1],mainParameter:"gamma",applyTo2d:function(t){var e,i=t.imageData,r=i.data,n=this.gamma,s=r.length,o=1/n[0],a=1/n[1],h=1/n[2];for(this.rVals||(this.rVals=new Uint8Array(256),this.gVals=new Uint8Array(256),this.bVals=new Uint8Array(256)),e=0,s=256;e'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t},_render:function(t){this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")},_renderText:function(t){this._renderTextFill(t),this._renderTextStroke(t)},_setTextStyles:function(t,e,i){t.textBaseline="alphabetic",t.font=this._getFontDeclaration(e,i)},calcTextWidth:function(){for(var t=this.getLineWidth(0),e=1,i=this._textLines.length;et&&(t=r)}return t},_renderTextLine:function(t,e,i,r,n,s){this._renderChars(t,e,i,r,n,s)},_renderTextLinesBackground:function(t){if(this.textBackgroundColor||this.styleHas("textBackgroundColor")){for(var e,i,r,n,s,o,a=0,h=t.fillStyle,c=this._getLeftOffset(),l=this._getTopOffset(),u=0,f=0,d=0,g=this._textLines.length;ds)){var v=h-s;c[t]=h,c[f]+=v,s=h}return{width:s*g,kernedWidth:h*g}},getHeightOfChar:function(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")},measureLine:function(t){var e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e},_measureLine:function(t){var e,i,r,n,s=0,o=this._textLines[t],a=0,h=new Array(o.length);for(this.__charBounds[t]=h,e=0;e0&&!n){var u=this.__charBounds[e][i-1];l.left=u.left+u.width+a.kernedWidth-a.width}return l},getHeightOfLine:function(t){if(this.__lineHeights[t])return this.__lineHeights[t];for(var e=this._textLines[t],i=this.getHeightOfChar(t,0),r=1,n=e.length;ri&&(i=s)}return this.__lineHeights[t]=i*this.lineHeight*this._fontSizeMult,this.__lineHeights[t]},calcTextHeight:function(){for(var t,e=0,i=0,r=this._textLines.length;i0?(t.fillStyle=f,s&&f&&t.fillRect(d+r+o,g+l*(1-this._fontSizeFraction)+this.offsets[e]*this.fontSize,a,this.fontSize/15),o=h.left,a=h.width,s=c,f=u):a+=h.kernedWidth;t.fillStyle=u,c&&u&&t.fillRect(d+r+o,g+l*(1-this._fontSizeFraction)+this.offsets[e]*this.fontSize,a,this.fontSize/15),g+=i}else g+=i;this._removeShadow(t)}},_getFontDeclaration:function(t,i){var r=t||this;return[e.isLikelyNode?r.fontWeight:r.fontStyle,e.isLikelyNode?r.fontStyle:r.fontWeight,i?n+"px":r.fontSize+"px",e.isLikelyNode?'"'+r.fontFamily+'"':r.fontFamily].join(" ")},render:function(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._shouldClearDimensionCache()&&this.initDimensions(),this.callSuper("render",t)))},_splitTextIntoLines:function(t){for(var i=t.split(this._reNewline),r=new Array(i.length),n=["\n"],s=[],o=0;o-1&&(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,r,n){if(!t)return r(null);var s=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);if(n=e.util.object.extend(n?i(n):{},s),n.top=n.top||0,n.left=n.left||0,s.textDecoration){var o=s.textDecoration;o.indexOf("underline")!==-1&&(n.underline=!0),o.indexOf("overline")!==-1&&(n.overline=!0),o.indexOf("line-through")!==-1&&(n.linethrough=!0),delete n.textDecoration}"dx"in s&&(n.left+=s.dx),"dy"in s&&(n.top+=s.dy),"fontSize"in n||(n.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),n.originX||(n.originX="left");var a="";"textContent"in t?a=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(a=t.firstChild.data),a=a.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var h=new e.Text(a,n),c=h.getScaledHeight()/h.height,l=(h.height+h.strokeWidth)*h.lineHeight-h.height,u=l*c,f=h.getScaledHeight()+u,d=0;"center"===h.originX&&(d=h.getScaledWidth()/2),"right"===h.originX&&(d=h.getScaledWidth()),h.set({left:h.left-d,top:h.top-(f-h.fontSize*(.18+h._fontSizeFraction))/h.lineHeight}),h.originX="left",h.originY="top",r(h)},e.Text.fromObject=function(t,i){return e.Object._fromObject("Text",t,i,"text")},e.util.createAccessors&&e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){function t(t){t.textDecoration&&(t.textDecoration.indexOf("underline")>-1&&(t.underline=!0),t.textDecoration.indexOf("line-through")>-1&&(t.linethrough=!0),t.textDecoration.indexOf("overline")>-1&&(t.overline=!0),delete t.textDecoration)}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,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],inCompositionMode:!1,initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},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;r0?o:0)},this.cursorOffsetCache=i,this.cursorOffsetCache},renderCursor:function(t,e){var i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex>0?i.charIndex-1:0,s=this.getValueOfPropertyAt(r,n,"fontSize"),o=this.scaleX*this.canvas.getZoom(),a=this.cursorWidth/o,h=t.topOffset;h+=(1-this._fontSizeFraction)*this.getHeightOfLine(r)/this.lineHeight-s*(1-this._fontSizeFraction),this.inCompositionMode&&this.renderSelection(t,e),e.fillStyle=this.getValueOfPropertyAt(r,n,"fill"),e.globalAlpha=this.__isMousedown?1:this._currentCursorOpacity,e.fillRect(t.left+t.leftOffset-a/2,h+t.top,a,s)},renderSelection:function(t,e){for(var i=this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,r=this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd,n=this.get2DCursorLocation(i),s=this.get2DCursorLocation(r),o=n.lineIndex,a=s.lineIndex,h=n.charIndex<0?0:n.charIndex,c=s.charIndex<0?0:s.charIndex,l=o;l<=a;l++){var u=this._getLineLeftOffset(l)||0,f=this.getHeightOfLine(l),d=0,g=0,p=0;l===o&&(g=this.__charBounds[o][h].left),l>=o&&l1)&&(f/=this.lineHeight),this.inCompositionMode?(e.fillStyle=this.compositionColor||"black",e.fillRect(t.left+u+g,t.top+t.topOffset+f,p-g,1)):(e.fillStyle=this.selectionColor,e.fillRect(t.left+u+g,t.top+t.topOffset,p-g,f)),t.topOffset+=d}},getCurrentCharFontSize:function(){var t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")},getCurrentCharColor:function(){var t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fill")},_getCurrentCharIndex:function(){var t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}}),fabric.IText.fromObject=function(e,i){if(t(e),e.styles)for(var r in e.styles)for(var n in e.styles[r])t(e.styles[r][n]);fabric.Object._fromObject("IText",e,i,"text")}}(),function(){var t=fabric.util.object.clone;fabric.util.object.extend(fabric.IText.prototype,{initBehavior:function(){this.initAddedHandler(),this.initRemovedHandler(),this.initCursorSelectionHandlers(),this.initDoubleClickSimulation(),this.mouseMoveHandler=this.mouseMoveHandler.bind(this)},onDeselect:function(){this.isEditing&&this.exitEditing(),this.selected=!1,this.callSuper("onDeselect")},initAddedHandler:function(){var t=this;this.on("added",function(){var e=t.canvas;e&&(e._hasITextHandlers||(e._hasITextHandlers=!0,t._initCanvasHandlers(e)),e._iTextInstances=e._iTextInstances||[],e._iTextInstances.push(t))})},initRemovedHandler:function(){var t=this;this.on("removed",function(){var e=t.canvas;e&&(e._iTextInstances=e._iTextInstances||[],fabric.util.removeFromArray(e._iTextInstances,t),0===e._iTextInstances.length&&(e._hasITextHandlers=!1,t._removeCanvasHandlers(e)))})},_initCanvasHandlers:function(t){t._mouseUpITextHandler=function(){t._iTextInstances&&t._iTextInstances.forEach(function(t){t.__isMousedown=!1})}.bind(this),t.on("mouse:up",t._mouseUpITextHandler)},_removeCanvasHandlers:function(t){t.off("mouse:up",t._mouseUpITextHandler)},_tick:function(){this._currentTickState=this._animateCursor(this,1,this.cursorDuration,"_onTickComplete")},_animateCursor:function(t,e,i,r){var n;return n={isAborted:!1,abort:function(){this.isAborted=!0}},t.animate("_currentCursorOpacity",e,{duration:i,onComplete:function(){n.isAborted||t[r]()},onChange:function(){t.canvas&&t.selectionStart===t.selectionEnd&&t.renderCursorOrSelection()},abort:function(){return n.isAborted}}),n},_onTickComplete:function(){var t=this;this._cursorTimeout1&&clearTimeout(this._cursorTimeout1),this._cursorTimeout1=setTimeout(function(){t._currentTickCompleteState=t._animateCursor(t,0,this.cursorDuration/2,"_tick")},100)},initDelayedCursor:function(t){var e=this,i=t?0:this.cursorDelay;this.abortCursorAnimation(),this._currentCursorOpacity=1,this._cursorTimeout2=setTimeout(function(){e._tick()},i)},abortCursorAnimation:function(){var t=this._currentTickState||this._currentTickCompleteState;this._currentTickState&&this._currentTickState.abort(),this._currentTickCompleteState&&this._currentTickCompleteState.abort(),clearTimeout(this._cursorTimeout1),clearTimeout(this._cursorTimeout2),this._currentCursorOpacity=0,t&&this.canvas&&this.canvas.clearContext(this.canvas.contextTop||this.ctx)},selectAll:function(){this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea()},getSelectedText:function(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")},findWordBoundaryLeft:function(t){var e=0,i=t-1;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i--;for(;/\S/.test(this._text[i])&&i>-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i++;for(;/\S/.test(this._text[i])&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this._text[i])&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this.restartCursorIfNeeded(),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},fromStringToGraphemeSelection:function(t,e,i){var r=i.slice(0,t),n=fabric.util.string.graphemeSplit(r).length;if(t===e)return{selectionStart:n,selectionEnd:n};var s=i.slice(t,e),o=fabric.util.string.graphemeSplit(s).length;return{selectionStart:n,selectionEnd:n+o}},fromGraphemeToStringSelection:function(t,e,i){var r=i.slice(0,t),n=r.join("").length;if(t===e)return{selectionStart:n,selectionEnd:n};var s=i.slice(t,e),o=s.join("").length;return{selectionStart:n,selectionEnd:n+o}},_updateTextarea:function(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){var t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}},updateFromTextArea:function(){if(this.hiddenTextarea){this.cursorOffsetCache={},this.text=this.hiddenTextarea.value;var t=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value);this.selectionEnd=this.selectionStart=t.selectionEnd,this.inCompositionMode||(this.selectionStart=t.selectionStart),this.updateTextareaPosition()}},updateTextareaPosition:function(){if(this.selectionStart===this.selectionEnd){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,n=i.charIndex,s=this.getValueOfPropertyAt(r,n,"fontSize")*this.lineHeight,o=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),h.x+=this.canvas._offset.left,h.y+=this.canvas._offset.top,{left:h.x+"px",top:h.y+"px",fontSize:s+"px",charHeight: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.hiddenTextarea.blur&&this.hiddenTextarea.blur(),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]},removeStyleFromTo:function(t,e){var i,r,n=this.get2DCursorLocation(t,!0),s=this.get2DCursorLocation(e,!0),o=n.lineIndex,a=n.charIndex,h=s.lineIndex,c=s.charIndex;if(o!==h){if(this.styles[o])for(i=a;ie&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},restartCursorIfNeeded:function(){this._currentTickState&&!this._currentTickState.isAborted&&this._currentTickCompleteState&&!this._currentTickCompleteState.isAborted||this.initDelayedCursor()},insertNewlineStyleObject:function(e,i,r,n){var s,o={},a=!1;r||(r=1),this.shiftLineStyles(e,r),this.styles[e]&&this.styles[e][i-1]&&(s=this.styles[e][i-1]);for(var h in this.styles[e]){var c=parseInt(h,10);c>=i&&(a=!0,o[c-i]=this.styles[e][h],delete this.styles[e][h])}for(a?this.styles[e+r]=o:delete this.styles[e+r];r>1;)r--,n[r]?this.styles[e+r]={0:t(n[r])}:s?this.styles[e+r]={0:t(s)}:delete this.styles[e+r];this._forceClearCache=!0},insertCharStyleObject:function(e,i,r,n){var s=this.styles[e],o=t(s);r||(r=1);for(var a in o){var h=parseInt(a,10);h>=i&&(s[h+r]=o[h],o[h-r]||delete s[h])}if(this._forceClearCache=!0,s)if(n)for(;r--;)this.styles[e][i+r]=t(n[r]);else for(var c=s[i?i-1:1];c&&r--;)this.styles[e][i+r]=t(c)},insertNewStyleBlock:function(t,e,i){for(var r=this.get2DCursorLocation(e,!0),n=0,s=0,o=0;ot&&it?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),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,t.e)&&(this.fire("tripleclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},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.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("mousedblclick",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&&(!t.e.button||1===t.e.button)){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,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)||t.e.button&&1!==t.e.button||(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),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())},getSelectionStartFromPointer:function(t){for(var e,i,r=this.getLocalPointer(t),n=0,s=0,o=0,a=0,h=0,c=0,l=this._textLines.length;c0&&(a+=this._textLines[c-1].length+1);e=this._getLineLeftOffset(h),s=e*this.scaleX,i=this._textLines[h];for(var u=0,f=i.length;us?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"),this.hiddenTextarea.setAttribute("autocorrect","off"),this.hiddenTextarea.setAttribute("autocomplete","off"),this.hiddenTextarea.setAttribute("spellcheck","false"),this.hiddenTextarea.setAttribute("data-fabric-hiddentextarea","");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="white-space: nowrap; position: absolute; top: "+t.top+"; left: "+t.left+"; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; line-height: 1px; paddingーtop: "+t.fontSize+";", -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.copy.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:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown"},ctrlKeysMapUp:{67:"copy",88:"cut"},ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing&&!this.inCompositionMode){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(),t.keyCode>=33&&t.keyCode<=40?(this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone||this.inCompositionMode?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.requestRenderAll()))},onInput:function(t){var e=this.fromPaste;if(this.fromPaste=!1,t&&t.stopPropagation(),this.isEditing){var i,r,n=this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,s=this._text.length,o=n.length,a=o-s;""===this.hiddenTextarea.value&&(this.styles={},this.updateFromTextArea(),this.fire("changed"),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())),this.selectionStart!==this.selectionEnd?(i=this._text.slice(this.selectionStart,this.selectionEnd),a+=this.selectionEnd-this.selectionStart):oh.selectionStart?this.removeStyleFromTo(this.selectionEnd-i.length,this.selectionEnd):this.removeStyleFromTo(this.selectionEnd,this.selectionEnd+i.length)),r.length&&(e&&r.join("")===fabric.copiedText?this.insertNewStyleBlock(r,this.selectionStart,fabric.copiedTextStyle):this.insertNewStyleBlock(r,this.selectionStart)),this.updateFromTextArea(),this.fire("changed"),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())}},onCompositionStart:function(){this.inCompositionMode=!0},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){this.compositionStart=t.target.selectionStart,this.compositionEnd=t.target.selectionEnd,this.updateTextareaPosition()},copy:function(){if(this.selectionStart!==this.selectionEnd){var t=this.getSelectedText();fabric.copiedText=t,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),this._copyDone=!0}},paste:function(){this.fromPaste=!0},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},_getWidthBeforeCursor:function(t,e){var i,r=this._getLineLeftOffset(t);return e>0&&(i=this.__charBounds[t][e-1],r+=i.left+i.width),r},getDownCursorOffset:function(t,e){var i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),n=r.lineIndex;if(n===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-i;var s=r.charIndex,o=this._getWidthBeforeCursor(n,s),a=this._getIndexOnLine(n+1,o),h=this._textLines[n].slice(s);return h.length+a+2},_getSelectionForOffset:function(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart},getUpCursorOffset:function(t,e){var i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),n=r.lineIndex;if(0===n||t.metaKey||33===t.keyCode)return-i;var s=r.charIndex,o=this._getWidthBeforeCursor(n,s),a=this._getIndexOnLine(n-1,o),h=this._textLines[n].slice(0,s);return-this._textLines[n-1].length+a-h.length},_getIndexOnLine:function(t,e){for(var i,r,n=this._textLines[t],s=this._getLineLeftOffset(t),o=s,a=0,h=0,c=n.length;he){r=!0;var l=o-i,u=o,f=Math.abs(l-e),d=Math.abs(u-e);a=d=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){var i="get"+t+"CursorOffset",r=this[i](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(r):this.moveCursorWithoutShift(r),0!==r&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(void 0!==typeof r&&this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=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)&&(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=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(t):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.set("dirty",!0),this.setSelectionEnd(this.selectionStart),this._removeExtraneousStyles(),this.canvas&&this.canvas.requestRenderAll(),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.Text.prototype,{toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this._getSVGLeftTopOffsets(),r=this._getSVGTextAndBg(i.textTop,i.textLeft);return this._wrapSVGTextAndBg(e,r),t?t(e.join("")):e.join("")},_getSVGLeftTopOffsets:function(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}},_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=[],s=t;this._setSVGBg(n);for(var o=0,a=this._textLines.length;o",fabric.util.string.escapeXml(i),"\n"].join("")},_setSVGTextLineText:function(t,e,i,r){var n,s,o,a,h,c=this.getHeightOfLine(e),l="",u=0,f=this._textLines[e];r+=c*(1-this._fontSizeFraction)/this.lineHeight;for(var d=0,g=f.length-1;d<=g;d++)h=d===g||this.charSpacing,l+=f[d],o=this.__charBounds[e][d],0===u&&(i+=o.kernedWidth-o.width),u+=o.kernedWidth,"justify"!==this.textAlign||h||this._reSpaceAndTab.test(f[d])&&(h=!0),h||(n=n||this.getCompleteStyleDeclaration(e,d),s=this.getCompleteStyleDeclaration(e,d+1),h=this._hasStyleChanged(n,s)),h&&(a=this._getStyleDeclaration(e,d)||{},t.push(this._createTextCharSpan(l,a,i,r)),l="",n=s,i+=u,u=0)},_pushTextBgRect:function(i,r,n,s,o,a){i.push("\t\t\n')},_setSVGTextLineBg:function(t,e,i,r){for(var n,s,o=this._textLines[e],a=this.getHeightOfLine(e)/this.lineHeight,h=0,c=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),u=0,f=o.length;uthis.width&&this._set("width",this.dynamicMinWidth),"justify"===this.textAlign&&this.enlargeSpaces(),this.height=this.calcTextHeight()}},_generateStyleMap:function(t){for(var e=0,i=0,r=0,n={},s=0;s0?(i=0,r++,e++):this._reSpaceAndTab.test(t.graphemeText[r])&&s>0&&(i++,r++),n[s]={line:e,offset:i},r+=t.graphemeLines[s].length,i+=t.graphemeLines[s].length;return n},styleHas:function(t,i){if(this._styleMap&&!this.isWrapping){var r=this._styleMap[i];r&&(i=r.line)}return e.Text.prototype.styleHas.call(this,t,i)},_getStyleDeclaration:function(t,e){if(this._styleMap&&!this.isWrapping){var i=this._styleMap[t];if(!i)return null;t=i.line,e=i.offset+e}return this.callSuper("_getStyleDeclaration",t,e)},_setStyleDeclaration:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,this.styles[t][e]=i},_deleteStyleDeclaration:function(t,e){var i=this._styleMap[t];t=i.line,e=i.offset+e,delete this.styles[t][e]},_getLineStyle:function(t){var e=this._styleMap[t];return this.styles[e.line]},_setLineStyle:function(t,e){var i=this._styleMap[t];this.styles[i.line]=e},_deleteLineStyle:function(t){var e=this._styleMap[t];delete this.styles[e.line]},_wrapText:function(t,e){var i,r=[];for(this.isWrapping=!0,i=0;i=r&&!g&&(s.push(o),o=[],n=u,g=!0),g||o.push(l),o=o.concat(h),f=this._measureWord([l],i,c),c++,g=!1,u>d&&(d=u);return v&&s.push(o),d>this.dynamicMinWidth&&(this.dynamicMinWidth=d-p),s},_splitTextIntoLines:function(t){for(var i=e.Text.prototype._splitTextIntoLines.call(this,t),r=this._wrapText(i.lines,this.width),n=new Array(r.length),s=0;s=h.getMinWidth()?(h.set("width",l),!0):void 0},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]}})}(),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(fabric.canvasModule),Image=require(fabric.canvasModule).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.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.width=s.width,n.height=s.height,i=i||{},i.nodeCanvas=s,i.nodeCacheCanvas=o;var a=fabric.Canvas||fabric.StaticCanvas,h=new a(n,i);return h.nodeCanvas=s,h.nodeCacheCanvas=o,h.contextContainer=s.getContext("2d"),h.contextCache=o.getContext("2d"),h.Font=Canvas.Font,h};var originaInitStatic=fabric.StaticCanvas.prototype._initStatic;fabric.StaticCanvas.prototype._initStatic=function(t,e){t=t||fabric.document.createElement("canvas"),this.nodeCanvas=new Canvas(t.width,t.height),this.nodeCacheCanvas=new Canvas(t.width,t.height),originaInitStatic.call(this,t,e),this.contextContainer=this.nodeCanvas.getContext("2d"),this.contextCache=this.nodeCacheCanvas.getContext("2d"),this.Font=Canvas.Font},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){return this.nodeCanvas.createJPEGStream(t)},fabric.StaticCanvas.prototype._initRetinaScaling=function(){if(this._isRetinaScaling())return this.lowerCanvasEl.setAttribute("width",this.width*fabric.devicePixelRatio),this.lowerCanvasEl.setAttribute("height",this.height*fabric.devicePixelRatio),this.nodeCanvas.width=this.width*fabric.devicePixelRatio,this.nodeCanvas.height=this.height*fabric.devicePixelRatio,this.contextContainer.scale(fabric.devicePixelRatio,fabric.devicePixelRatio),this},fabric.Canvas&&(fabric.Canvas.prototype._initRetinaScaling=fabric.StaticCanvas.prototype._initRetinaScaling);var origSetBackstoreDimension=fabric.StaticCanvas.prototype._setBackstoreDimension;fabric.StaticCanvas.prototype._setBackstoreDimension=function(t,e){return origSetBackstoreDimension.call(this,t,e),this.nodeCanvas[t]=e,this},fabric.Canvas&&(fabric.Canvas.prototype._setBackstoreDimension=fabric.StaticCanvas.prototype._setBackstoreDimension)}}(); \ No newline at end of file +function copyGLTo2DDrawImage(t,e){var i=t.canvas,r=e.getContext("2d");r.translate(0,e.height),r.scale(1,-1);var n=i.height-e.height;r.drawImage(i,0,n,e.width,e.height,0,0,e.width,e.height)}function copyGLTo2DPutImageData(t,e){var i=e.getContext("2d"),r=e.width,n=e.height,s=r*n*4,o=new Uint8Array(this.imageBuffer,0,s),a=new Uint8ClampedArray(this.imageBuffer,0,s);t.readPixels(0,0,r,n,t.RGBA,t.UNSIGNED_BYTE,o);var h=new ImageData(a,r);i.putImageData(h,0,0)}var fabric=fabric||{version:"2.0.0-beta4"};"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(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E"),{features:{FetchExternalResources:["img"]}}),fabric.window=fabric.document.defaultView),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.iMatrix=[1,0,0,1,0,0],fabric.canvasModule="canvas",fabric.perfLimitSizeTotal=2097152,fabric.maxCacheSideLimit=4096,fabric.minCacheSideLimit=256,fabric.charWidthsCache={},fabric.textureSize=2048,fabric.enableGLFiltering=!0,fabric.devicePixelRatio=fabric.window.devicePixelRatio||fabric.window.webkitDevicePixelRatio||fabric.window.mozDevicePixelRatio||1,fabric.initFilterBackend=function(){return fabric.isWebglSupported&&fabric.isWebglSupported(fabric.textureSize)&&fabric.enableGLFiltering?(console.log("max texture size: "+fabric.maxTextureSize),new fabric.WebglFilterBackend({tileSize:fabric.textureSize})):fabric.Canvas2dFilterBackend?new fabric.Canvas2dFilterBackend:void 0},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)}},fabric.CommonMethods={_setOptions:function(t){for(var e in t)this.set(e,t[e])},_initGradient:function(t,e){!t||!t.colorStops||t instanceof fabric.Gradient||this.set(e,new fabric.Gradient(t))},_initPattern:function(t,e,i){!t||!t.source||t instanceof fabric.Pattern?i&&i():this.set(e,new fabric.Pattern(t,i))},_initClipping:function(t){if(t.clipTo&&"string"==typeof t.clipTo){var e=fabric.util.getFunctionBody(t.clipTo);"undefined"!=typeof e&&(this.clipTo=new Function("ctx",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,e){this[t]=e},toggle:function(t){var e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this},get:function(t){return this[t]}},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;var i,r=e.split("."),n=r.length,s=t||fabric.window;for(i=0;ir;)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},createImage:function(){return fabric.document.createElement("img")},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);var n,s,o=!0,a=t.getImageData(e,i,2*r||1,2*r||1),h=a.data.length;for(n=3;n0?M-=2*f:1===c&&M<0&&(M+=2*f);for(var A=Math.ceil(Math.abs(M/f*2)),L=[],I=M/A,R=8/3*Math.sin(I/4)*Math.sin(I/4)/Math.sin(I/2),F=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,m,b,_=Math.sqrt,y=Math.min,x=Math.max,C=Math.abs,S=[],w=[[],[]];f=6*t-12*i+6*n,u=-3*t+9*i-9*n+3*h,d=3*i-3*t;for(var T=0;T<2;++T)if(T>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),C(u)<1e-12){if(C(f)<1e-12)continue;g=-d/f,0=e})}function i(t,e){return n(t,e,function(t,e){return t/g,">")}function r(t){for(var e,i=0,r=[],i=0;i57343)return t.charAt(e);if(55296<=i&&i<=56319){if(t.length<=e+1)throw"High surrogate without following low surrogate";var r=t.charCodeAt(e+1);if(56320>r||r>57343)throw"High surrogate without following low surrogate";return t.charAt(e)+t.charAt(e+1)}if(0===e)throw"Low surrogate without preceding high surrogate";var n=t.charCodeAt(e-1);if(55296>n||n>56319)throw"Low surrogate without preceding high surrogate";return!1}fabric.util.string={camelize:t,capitalize:e,escapeXml:i,graphemeSplit:r}}(),function(){function t(){}function e(t){for(var e=null,i=this;i.constructor.superclass;){var n=i.constructor.superclass.prototype[t];if(i[t]!==n){e=n;break}i=i.constructor.superclass.prototype}return e?arguments.length>1?e.apply(this,r.call(arguments,1)):e.call(this):console.log("tried to callSuper "+t+", method not found in prototype chain",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(c(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(t){}o||(h=function(t){for(var e=new Array(t.length),i=t.length;i--;)e[i]=t[i];return e});var c;c=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=c}(),function(){function t(t,e){return t+(/\?/.test(t)?"&":"?")+e}function e(){}function i(i,n){n||(n={});var s=n.method?n.method.toUpperCase():"GET",o=n.onComplete||function(){},a=r(),h=n.body||n.parameters;return a.onreadystatechange=function(){4===a.readyState&&(o(a),a.onreadystatechange=e)},"GET"===s&&(h=null,"string"==typeof n.parameters&&(i=t(i,n.parameters))),a.open(s,i,!0),"POST"!==s&&"PUT"!==s||a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.send(h),a}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(t){}}();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(){return!1}function e(e){i(function(r){e||(e={});var n,s=r||+new Date,o=e.duration||500,a=s+o,h=e.onChange||t,c=e.abort||t,l=e.onComplete||t,u=e.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},f="startValue"in e?e.startValue:0,d="endValue"in e?e.endValue:100,g=e.byValue||d-f;e.onStart&&e.onStart(),function t(r){if(c())return void l(d,1,1);n=r||+new Date;var p=n>a?o:n-s,v=p/o,m=u(p,f,g,o),b=Math.abs((m-f)/g);return h(m,b,v),n>a?void(e.onComplete&&e.onComplete()):void i(t)}(s)})}function i(){return r.apply(fabric.window,arguments)}var r=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=e,fabric.util.requestAnimFrame=i}(),function(){function t(t,e,i){var r="rgba("+parseInt(t[0]+i*(e[0]-t[0]),10)+","+parseInt(t[1]+i*(e[1]-t[1]),10)+","+parseInt(t[2]+i*(e[2]-t[2]),10);return r+=","+(t&&e?parseFloat(t[3]+i*(e[3]-t[3])):1),r+=")"}function e(e,i,r,n){var s=new fabric.Color(e).getSource(),o=new fabric.Color(i).getSource();n=n||{},fabric.util.animate(fabric.util.object.extend(n,{duration:r||500,startValue:s,endValue:o,byValue:o,easing:function(e,i,r,s){var o=n.colorEasing?n.colorEasing(e,s):1-Math.cos(e/s*(Math.PI/2));return t(i,r,o)}}))}fabric.util.animateColor=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)&&(x=" translate("+_(f)+" "+_(d)+") "),r=x+" matrix("+o+" 0 0 "+a+" "+h*o+" "+c*a+") ","svg"===t.nodeName){for(n=t.ownerDocument.createElement("g");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,e){for(;t&&(t=t.parentNode);)if(t.nodeName&&e.test(t.nodeName.replace("svg:",""))&&!t.getAttribute("instantiated_by_use"))return!0;return!1}var p=t.fabric||(t.fabric={}),v=p.util.object.extend,m=p.util.object.clone,b=p.util.toFixed,_=p.util.parseUnit,y=p.util.multiplyTransformMatrices,x=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/i,C=/^(symbol|image|marker|pattern|view|svg)$/i,S=/^(?:pattern|defs|symbol|metadata|clipPath|mask)$/i,w=/^(symbol|g|a|svg)$/i,T={ +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",opacity:"opacity"},O={stroke:"strokeOpacity",fill:"fillOpacity"};p.cssRules={},p.gradientDefs={},p.parseTransformAttribute=function(){function t(t,e){var i=Math.cos(e[0]),r=Math.sin(e[0]),n=0,s=0;3===e.length&&(n=e[1],s=e[2]),t[0]=i,t[1]=r,t[2]=-r,t[3]=i,t[4]=n-(i*n-r*s),t[5]=s-(r*n+i*s)}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,i){t[i]=Math.tan(p.util.degreesToRadians(e[0]))}function r(t,e){t[4]=e[0],2===e.length&&(t[5]=e[1])}var n=[1,0,0,1,0,0],s=p.reNum,o="(?:\\s+,?\\s*|,\\s*)",a="(?:(skewX)\\s*\\(\\s*("+s+")\\s*\\))",h="(?:(skewY)\\s*\\(\\s*("+s+")\\s*\\))",c="(?:(rotate)\\s*\\(\\s*("+s+")(?:"+o+"("+s+")"+o+"("+s+"))?\\s*\\))",l="(?:(scale)\\s*\\(\\s*("+s+")(?:"+o+"("+s+"))?\\s*\\))",u="(?:(translate)\\s*\\(\\s*("+s+")(?:"+o+"("+s+"))?\\s*\\))",f="(?:(matrix)\\s*\\(\\s*("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")"+o+"("+s+")\\s*\\))",d="(?:"+f+"|"+u+"|"+l+"|"+c+"|"+a+"|"+h+")",g="(?:"+d+"(?:"+o+"*"+d+")*)",v="^\\s*(?:"+g+"?)\\s*$",m=new RegExp(v),b=new RegExp(d,"g");return function(s){var o=n.concat(),a=[];if(!s||s&&!m.test(s))return o;s.replace(b,function(s){var h=new RegExp(d).exec(s).filter(function(t){return!!t}),c=h[1],l=h.slice(2).map(parseFloat);switch(c){case"translate":r(o,l);break;case"rotate":l[0]=p.util.degreesToRadians(l[0]),t(o,l);break;case"scale":e(o,l);break;case"skewX":i(o,l,2);break;case"skewY":i(o,l,1);break;case"matrix":o=l}a.push(o.concat()),o=n.concat()});for(var h=a[0];a.length>1;)a.shift(),h=p.util.multiplyTransformMatrices(h,a[0]);return h}}();var k=new RegExp("^\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*$");p.parseSVGDocument=function(t,e,i,r){if(t){f(t);var n=p.Object.__uid++,s=d(t),o=p.util.toArray(t.getElementsByTagName("*"));if(s.crossOrigin=r&&r.crossOrigin,s.svgUid=n,0===o.length&&p.isLikelyNode){o=t.selectNodes('//*[name(.)!="svg"]');for(var a=[],h=0,c=o.length;h/i,""))),n&&n.documentElement||e&&e(null),p.parseSVGDocument(n.documentElement,function(t,i,r,n){e&&e(t,i,r,n)},i,r)}t=t.replace(/^\n\s*/,"").trim(),new p.util.request(t,{method:"get",onComplete:n})},loadSVGFromString:function(t,e,i,r){t=t.trim();var n;if("undefined"!=typeof DOMParser){var s=new DOMParser;s&&s.parseFromString&&(n=s.parseFromString(t,"text/xml"))}else p.window.ActiveXObject&&(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t.replace(//i,"")));p.parseSVGDocument(n.documentElement,function(t,i,r,n){e(t,i,r,n)},i,r)}})}("undefined"!=typeof exports?exports:this),fabric.ElementsParser=function(t,e,i,r,n){this.elements=t,this.callback=e,this.options=i,this.reviver=r,this.svgUid=i&&i.svgUid||0,this.parsingOptions=n},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"undefined"==typeof i&&(i=.5),i=Math.max(Math.min(1,i),0),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 this.lerp(t)},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){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new e(this.x,this.y)}}))}("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={constructor:e,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},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.appendPoint(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,s,o,a=new e,h=r.length,c=0;c0&&(a.status="Intersection"),a},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}var n=fabric.util.object.clone;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:parseFloat(e),color:i.toRgb(),opacity:i.getAlpha()})}return this},toObject:function(t){var e={type:this.type,coords:this.coords,colorStops:this.colorStops,offsetX:this.offsetX,offsetY:this.offsetY,gradientTransform:this.gradientTransform?this.gradientTransform.concat():this.gradientTransform};return fabric.util.populateWithProperties(this,e,t),e},toSVG:function(t){var e,i,r=n(this.coords,!0),s=n(this.colorStops,!0),o=r.r1>r.r2;s.sort(function(t,e){return t.offset-e.offset});for(var a in r)"x1"===a||"x2"===a?r[a]+=this.offsetX-t.width/2:"y1"!==a&&"y2"!==a||(r[a]+=this.offsetY-t.height/2);if(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']),"radial"===this.type){if(o){s=s.concat(),s.reverse();for(var h=0;h0)for(var l=Math.max(r.r1,r.r2),u=c/l,h=0;h\n')}return e.push("linear"===this.type?"\n":"\n"),e.join("")},toLive:function(t){var e,i=fabric.util.object.clone(this.coords);if(this.type){"linear"===this.type?e=t.createLinearGradient(i.x1,i.y1,i.x2,i.y2):"radial"===this.type&&(e=t.createRadialGradient(i.x1,i.y1,i.r1,i.x2,i.y2,i.r2));for(var r=0,n=this.colorStops.length;r\n\n\n'},setOptions:function(t){for(var e in t)this[e]=t[e]},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=fabric.util.transformPoint,s=fabric.util.invertTransform,o=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e||(e={}),this.renderAndResetBound=this.renderAndReset.bind(this),this.requestRenderAllBound=this.requestRenderAll.bind(this),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,clipTo:null,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:fabric.iMatrix.concat(),backgroundVpt:!0,overlayVpt:!0,onBeforeScaleRotate:function(){},enableRetinaScaling:!0,vptCoords:{},skipOffscreen:!0,_initStatic:function(t,e){var i=this.requestRenderAllBound;this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this._setImageSmoothing(),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1!==fabric.devicePixelRatio&&this.enableRetinaScaling},getRetinaScaling:function(){return this._isRetinaScaling()?fabric.devicePixelRatio:1},_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){return this[t]=e,this._initGradient(e,t),this._initPattern(e,t,i),this},_createCanvasElement:function(t){var e=fabric.util.createCanvasElement(t);if(e.style||(e.style={}),!e)throw o;if("undefined"==typeof e.getContext)throw o;return e},_initOptions:function(t){this._setOptions(t),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(t),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.requestRenderAll(),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 this.viewportTransform[0]},setViewportTransform:function(t){var e,i=this._activeObject,r=!1,n=!0;this.viewportTransform=t;for(var s=0,o=this._objects.length;s"),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","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),"\n")},createSVGRefElementsMarkup:function(){var t=this,e=["backgroundColor","overlayColor"].map(function(e){var i=t[e];if(i&&i.toLive)return i.toSVG(t,!1)});return e.join("")},createSVGFontFacesMarkup:function(){for(var t,e,i,r,n,s,o,a="",h={},c=fabric.fontPaths,l=this.getObjects(),u=0,f=l.length;u',"\n",a,"","\n"].join("")),a},_setSVGObjects:function(t,e){for(var i,r=0,n=this.getObjects(),s=n.length;r\n")}else t.push('\n")},sendToBack:function(t){if(!t)return this;var e,r,n,s=this._activeObject;if(t===s&&"activeSelection"===t.type)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.renderOnAddRemove&&this.requestRenderAll(),this},bringToFront:function(t){if(!t)return this;var e,r,n,s=this._activeObject;if(t===s&&"activeSelection"===t.type)for(n=s._objects,e=0;e0+c&&(o=s-1,i(this._objects,n),this._objects.splice(o,0,n)),c++;else s=this._objects.indexOf(t),0!==s&&(o=this._findNewLowerIndex(t,s,e),i(this._objects,t),this._objects.splice(o,0,t));return this.renderOnAddRemove&&this.requestRenderAll(),this},_findNewLowerIndex:function(t,e,i){var r;if(i){r=e;for(var n=e-1;n>=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._activeObject,c=0;if(t===h&&"activeSelection"===t.type)for(a=h._objects,r=a.length;r--;)n=a[r],s=this._objects.indexOf(n),s"}}),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(t){}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,e=this.canvas.getZoom();t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*e,t.shadowOffsetX=this.shadow.offsetX*e,t.shadowOffsetY=this.shadow.offsetY*e}},_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&&!this.preserveObjectStacking){e=[],i=[];for(var n=0,s=this._objects.length;n1&&(this._activeObject._objects=i),e.push.apply(e,i)}else e=this._objects;return e},renderAll:function(){!this.contextTopDirty||this._groupSelector||this.isDrawingMode||(this.clearContext(this.contextTop),this.contextTopDirty=!1);var t=this.contextContainer;return this.renderCanvas(t,this._chooseObjectsToRender()),this},renderTop:function(){var t=this.contextTop;return this.clearContext(t),this.selection&&this._groupSelector&&this._drawSelection(t),this.fire("after:render"),this.contextTopDirty=!0,this},_resetCurrentTransform:function(){var t=this._currentTransform;t.target.set({scaleX:t.original.scaleX,scaleY:t.original.scaleY,skewX:t.original.skewX,skewY:t.original.skewY,left:t.original.left,top:t.original.top}),this._shouldCenterTransform(t.target)?"rotate"===t.action?this._setOriginToCenter(t.target):("center"!==t.originX&&("right"===t.originX?t.mouseXSign=-1:t.mouseXSign=1),"center"!==t.originY&&("bottom"===t.originY?t.mouseYSign=-1:t.mouseYSign=1),t.originX="center",t.originY="center"):(t.originX=t.original.originX,t.originY=t.original.originY)},containsPoint:function(t,e,i){var r,n=!0,s=i||this.getPointer(t,n);return r=e.group&&e.group===this._activeObject&&"activeSelection"===e.group.type?this._normalizePointer(e.group,s):{x:s.x,y:s.y},e.containsPoint(r)||e._findTargetCorner(s)},_normalizePointer:function(t,e){var i=t.calcTransformMatrix(),r=fabric.util.invertTransform(i),n=this.restorePointerVpt(e);return fabric.util.transformPoint(n,r)},isTargetTransparent:function(t,e,i){var r=t.hasBorders,n=t.transparentCorners,s=this.contextCache,o=t.selectionBackgroundColor;t.hasBorders=t.transparentCorners=!1,t.selectionBackgroundColor="",s.save(),s.transform.apply(s,this.viewportTransform),t.render(s),s.restore(),t.active&&t._renderControls(s),t.hasBorders=r,t.transparentCorners=n,t.selectionBackgroundColor=o;var a=fabric.util.isTransparent(s,e,i,this.targetFindTolerance);return this.clearContext(s),a},_shouldClearSelection:function(t,e){var i=this.getActiveObjects(),r=this._activeObject;return!e||e&&r&&i.length>1&&i.indexOf(e)===-1&&r!==e&&!t[this.selectionKey]||e&&!e.evented||e&&!e.selectable&&r&&r!==e},_shouldCenterTransform:function(t){if(t){var e,i=this._currentTransform;return"scale"===i.action||"scaleX"===i.action||"scaleY"===i.action?e=this.centeredScaling||t.centeredScaling:"rotate"===i.action&&(e=this.centeredRotation||t.centeredRotation),e?!i.altKey:i.altKey}},_getOriginFromCorner:function(t,e){var i={x:t.originX,y:t.originY};return"ml"===e||"tl"===e||"bl"===e?i.x="right":"mr"!==e&&"tr"!==e&&"br"!==e||(i.x="left"),"tl"===e||"mt"===e||"tr"===e?i.y="bottom":"bl"!==e&&"mb"!==e&&"br"!==e||(i.y="top"),i},_getActionFromCorner:function(t,e,i){if(!e)return"drag";switch(e){case"mtr":return"rotate";case"ml":case"mr":return i[this.altActionKey]?"skewY":"scaleX";case"mt":case"mb":return i[this.altActionKey]?"skewX":"scaleY";default:return"scale"}},_setupCurrentTransform:function(t,i){if(i){var r=this.getPointer(t),n=i._findTargetCorner(this.getPointer(t,!0)),s=this._getActionFromCorner(i,n,t),o=this._getOriginFromCorner(i,n);this._currentTransform={target:i,action:s,corner:n,scaleX:i.scaleX,scaleY:i.scaleY,skewX:i.skewX,skewY:i.skewY,offsetX:r.x-i.left,offsetY:r.y-i.top,originX:o.x,originY:o.y,ex:r.x,ey:r.y,lastX:r.x,lastY:r.y,left:i.left,top:i.top,theta:e(i.angle),width:i.width*i.scaleX,mouseXSign:1,mouseYSign:1,shiftKey:t.shiftKey,altKey:t[this.centeredKey]},this._currentTransform.original={left:i.left,top:i.top,scaleX:i.scaleX,scaleY:i.scaleY,skewX:i.skewX,skewY:i.skewY,originX:o.x,originY:o.y},this._resetCurrentTransform()}},_translateObject:function(t,e){var i=this._currentTransform,r=i.target,n=t-i.offsetX,s=e-i.offsetY,o=!r.get("lockMovementX")&&r.left!==n,a=!r.get("lockMovementY")&&r.top!==s;return o&&r.set("left",n),a&&r.set("top",s),o||a},_changeSkewTransformOrigin:function(t,e,i){var r="originX",n={0:"center"},s=e.target.skewX,o="left",a="right",h="mt"===e.corner||"ml"===e.corner?1:-1,c=1;t=t>0?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&&cs?t.x<0?t.x+=s:t.x-=s:t.x=0,n(t.y)>s?t.y<0?t.y+=s:t.y-=s: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),h=!0;if(n.target.snapAngle>0){var c=n.target.snapAngle,l=n.target.snapThreshold||c,u=Math.ceil(a/c)*c,f=Math.floor(a/c)*c;Math.abs(a-f)0?0:-i),e.ey-(r>0?0:-r),a,h)),this.selectionLineWidth&&this.selectionBorderColor)if(t.lineWidth=this.selectionLineWidth,t.strokeStyle=this.selectionBorderColor,this.selectionDashArray.length>1&&!s){var c=e.ex+o-(i>0?0:a),l=e.ey+o-(r>0?0:h);t.beginPath(),fabric.util.drawDashedLine(t,c,l,c+a,l,this.selectionDashArray),fabric.util.drawDashedLine(t,c,l+h-1,c+a,l+h-1,this.selectionDashArray),fabric.util.drawDashedLine(t,c,l,c,l+h,this.selectionDashArray),fabric.util.drawDashedLine(t,c+a-1,l,c+a-1,l+h,this.selectionDashArray),t.closePath(),t.stroke()}else fabric.Object.prototype._setLineDash.call(this,t,this.selectionDashArray),t.strokeRect(e.ex+o-(i>0?0:a),e.ey+o-(r>0?0:h),a,h)},findTarget:function(t,e){if(!this.skipTargetFind){var i,r=!0,n=this.getPointer(t,r),s=this._activeObject,o=this.getActiveObjects();if(this.targets=[],o.length>1&&!e&&s===this._searchPossibleTargets([s],n))return this._fireOverOutEvents(s,t),s;if(1===o.length&&s._findTargetCorner(n))return this._fireOverOutEvents(s,t),s;if(1===o.length&&s===this._searchPossibleTargets([s],n)){if(!this.preserveObjectStacking)return this._fireOverOutEvents(s,t),s;i=s}var a=this._searchPossibleTargets(this._objects,n);return t[this.altSelectionKey]&&a&&i&&a!==i&&(a=i),this._fireOverOutEvents(a,t),a}},_fireOverOutEvents:function(t,e){var i,r,n=this._hoveredTarget;n!==t&&(i={e:e,target:t,previousTarget:this._hoveredTarget},r={e:e,target:this._hoveredTarget,nextTarget:t},this._hoveredTarget=t),t?n!==t&&(n&&(this.fire("mouse:out",r),n.fire("mouseout",r)),this.fire("mouse:over",i),t.fire("mouseover",i)):n&&(this.fire("mouse:out",r),n.fire("mouseout",r))},_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},restorePointerVpt:function(t){return fabric.util.transformPoint(t,fabric.util.invertTransform(this.viewportTransform))},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=this.restorePointerVpt(s)),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.upperCanvasEl.className="":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.width+"px",height:this.height+"px",position:"relative"}),fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(t){var e=this.width||t.width,i=this.height||t.height;fabric.util.setStyle(t,{position:"absolute",width:e+"px",height:i+"px",left:0,top:0,"touch-action":"none"}),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},getActiveObject:function(){return this._activeObject},getActiveObjects:function(){var t=this._activeObject;return t?"activeSelection"===t.type&&t._objects?t._objects:[t]:[]},_onObjectRemoved:function(t){t===this._activeObject&&(this.fire("before:selection:cleared",{target:t}),this._discardActiveObject(),this.fire("selection:cleared",{target:t}),t.fire("deselected")),this._hoveredTarget===t&&(this._hoveredTarget=null),this.callSuper("_onObjectRemoved",t)},setActiveObject:function(t,e){var i=this._activeObject;return t===i?this:(this._setActiveObject(t)&&(i&&i.fire("deselected",{e:e}),this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e})),this)},_setActiveObject:function(t){var e=this._activeObject;return e!==t&&(!!this._discardActiveObject()&&(this._activeObject=t,t.set("active",!0),!0))},_discardActiveObject:function(){var t=this._activeObject;if(t&&t.onDeselect&&"function"==typeof t.onDeselect){if(t.onDeselect())return!1;t.set("active",!1),this._activeObject=null}return!0},discardActiveObject:function(t){var e=this._activeObject;return e&&(this.fire("before:selection:cleared",{target:e,e:t}),this._discardActiveObject()&&(this.fire("selection:cleared",{e:t}),e.fire("deselected",{e:t}))),this},dispose:function(){fabric.StaticCanvas.prototype.dispose.call(this);var t=this.wrapperEl;return this.removeListeners(),t.removeChild(this.upperCanvasEl),t.removeChild(this.lowerCanvasEl),delete this.upperCanvasEl,t.parentNode&&t.parentNode.replaceChild(this.lowerCanvasEl,this.wrapperEl),delete this.wrapperEl,this},clear:function(){return this.discardActiveObject(),this.clearContext(this.contextTop),this.callSuper("clear")},drawControls:function(t){var e=this._activeObject;e&&e._renderControls(t)},_toObject:function(t,e,i){var r=this._realizeGroupTransformOnObject(t),n=this.callSuper("_toObject",t,e,i);return this._unwindGroupTransformOnObject(t,r),n},_realizeGroupTransformOnObject:function(t){if(t.group&&"activeSelection"===t.group.type&&this._activeObject===t.group){var e=["angle","flipX","flipY","left","scaleX","scaleY","skewX","skewY","top"],i={};return e.forEach(function(e){i[e]=t[e]}),this._activeObject.realizeTransform(t),i}return null},_unwindGroupTransformOnObject:function(t,e){e&&t.set(e)},_setSVGObject:function(t,e,i){var r=this._realizeGroupTransformOnObject(e);this.callSuper("_setSVGObject",t,e,i),this._unwindGroupTransformOnObject(e,r)}});for(var a in fabric.StaticCanvas)"prototype"!==a&&(fabric.Canvas[a]=fabric.StaticCanvas[a]);fabric.isTouchSupported&&(fabric.Canvas.prototype._setCursorFromEvent=function(){})}(),function(){function t(t,e){return"which"in t?t.which===e:t.button===e-1}var e={mt:0,tr:1,mr:2,br:3,mb:4,bl:5,ml:6,tl:7},i=fabric.util.addListener,r=fabric.util.removeListener,n=3,s=2,o=1; +fabric.util.object.extend(fabric.Canvas.prototype,{cursorMap:["n-resize","ne-resize","e-resize","se-resize","s-resize","sw-resize","w-resize","nw-resize"],_initEventListeners:function(){this.removeListeners(),this._bindEvents(),i(fabric.window,"resize",this._onResize),i(this.upperCanvasEl,"mousedown",this._onMouseDown),i(this.upperCanvasEl,"dblclick",this._onDoubleClick),i(this.upperCanvasEl,"mousemove",this._onMouseMove),i(this.upperCanvasEl,"mouseout",this._onMouseOut),i(this.upperCanvasEl,"mouseenter",this._onMouseEnter),i(this.upperCanvasEl,"wheel",this._onMouseWheel),i(this.upperCanvasEl,"contextmenu",this._onContextMenu),i(this.upperCanvasEl,"touchstart",this._onMouseDown,{passive:!1}),i(this.upperCanvasEl,"touchmove",this._onMouseMove,{passive:!1}),"undefined"!=typeof eventjs&&"add"in eventjs&&(eventjs.add(this.upperCanvasEl,"gesture",this._onGesture),eventjs.add(this.upperCanvasEl,"drag",this._onDrag),eventjs.add(this.upperCanvasEl,"orientation",this._onOrientationChange),eventjs.add(this.upperCanvasEl,"shake",this._onShake),eventjs.add(this.upperCanvasEl,"longpress",this._onLongPress))},_bindEvents:function(){this.eventsBinded||(this._onMouseDown=this._onMouseDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this._onMouseUp=this._onMouseUp.bind(this),this._onResize=this._onResize.bind(this),this._onGesture=this._onGesture.bind(this),this._onDrag=this._onDrag.bind(this),this._onShake=this._onShake.bind(this),this._onLongPress=this._onLongPress.bind(this),this._onOrientationChange=this._onOrientationChange.bind(this),this._onMouseWheel=this._onMouseWheel.bind(this),this._onMouseOut=this._onMouseOut.bind(this),this._onMouseEnter=this._onMouseEnter.bind(this),this._onContextMenu=this._onContextMenu.bind(this),this._onDoubleClick=this._onDoubleClick.bind(this),this.eventsBinded=!0)},removeListeners:function(){r(fabric.window,"resize",this._onResize),r(this.upperCanvasEl,"mousedown",this._onMouseDown),r(this.upperCanvasEl,"mousemove",this._onMouseMove),r(this.upperCanvasEl,"mouseout",this._onMouseOut),r(this.upperCanvasEl,"mouseenter",this._onMouseEnter),r(this.upperCanvasEl,"wheel",this._onMouseWheel),r(this.upperCanvasEl,"contextmenu",this._onContextMenu),r(this.upperCanvasEl,"doubleclick",this._onDoubleClick),r(this.upperCanvasEl,"touchstart",this._onMouseDown),r(this.upperCanvasEl,"touchmove",this._onMouseMove),"undefined"!=typeof eventjs&&"remove"in eventjs&&(eventjs.remove(this.upperCanvasEl,"gesture",this._onGesture),eventjs.remove(this.upperCanvasEl,"drag",this._onDrag),eventjs.remove(this.upperCanvasEl,"orientation",this._onOrientationChange),eventjs.remove(this.upperCanvasEl,"shake",this._onShake),eventjs.remove(this.upperCanvasEl,"longpress",this._onLongPress))},_onGesture:function(t,e){this.__onTransformGesture&&this.__onTransformGesture(t,e)},_onDrag:function(t,e){this.__onDrag&&this.__onDrag(t,e)},_onMouseWheel:function(t){this.__onMouseWheel(t)},_onMouseOut:function(t){var e=this._hoveredTarget;this.fire("mouse:out",{target:e,e:t}),this._hoveredTarget=null,e&&e.fire("mouseout",{e:t}),this._iTextInstances&&this._iTextInstances.forEach(function(t){t.isEditing&&t.hiddenTextarea.focus()})},_onMouseEnter:function(t){this.findTarget(t)||(this.fire("mouse:over",{target:null,e:t}),this._hoveredTarget=null)},_onOrientationChange:function(t,e){this.__onOrientationChange&&this.__onOrientationChange(t,e)},_onShake:function(t,e){this.__onShake&&this.__onShake(t,e)},_onLongPress:function(t,e){this.__onLongPress&&this.__onLongPress(t,e)},_onContextMenu:function(t){return this.stopContextMenu&&(t.stopPropagation(),t.preventDefault()),!1},_onDoubleClick:function(t){var e;this._handleEvent(t,"dblclick",e)},_onMouseDown:function(t){this.__onMouseDown(t),i(fabric.document,"touchend",this._onMouseUp,{passive:!1}),i(fabric.document,"touchmove",this._onMouseMove,{passive:!1}),r(this.upperCanvasEl,"mousemove",this._onMouseMove),r(this.upperCanvasEl,"touchmove",this._onMouseMove),"touchstart"===t.type?r(this.upperCanvasEl,"mousedown",this._onMouseDown):(i(fabric.document,"mouseup",this._onMouseUp),i(fabric.document,"mousemove",this._onMouseMove))},_onMouseUp:function(t){if(this.__onMouseUp(t),r(fabric.document,"mouseup",this._onMouseUp),r(fabric.document,"touchend",this._onMouseUp),r(fabric.document,"mousemove",this._onMouseMove),r(fabric.document,"touchmove",this._onMouseMove),i(this.upperCanvasEl,"mousemove",this._onMouseMove),i(this.upperCanvasEl,"touchmove",this._onMouseMove,{passive:!1}),"touchend"===t.type){var e=this;setTimeout(function(){i(e.upperCanvasEl,"mousedown",e._onMouseDown)},400)}},_onMouseMove:function(t){!this.allowTouchScrolling&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t)},_onResize:function(){this.calcOffset()},_shouldRender:function(t,e){var i=this._activeObject;return(!i||!i.isEditing||t!==i)&&!!(t&&(t.isMoving||t!==i)||!t&&i||!t&&!i&&!this._groupSelector||e&&this._previousPointer&&this.selection&&(e.x!==this._previousPointer.x||e.y!==this._previousPointer.y))},__onMouseUp:function(e){var i;if(t(e,n))return void(this.fireRightClick&&this._handleEvent(e,"up",i,n));if(t(e,s))return void(this.fireMiddleClick&&this._handleEvent(e,"up",i,s));if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(e);var r=!0,a=this._currentTransform,h=this._groupSelector,c=!h||0===h.left&&0===h.top;a&&(this._finalizeCurrentTransform(e),r=!a.actionPerformed),i=r?this.findTarget(e,!0):a.target;var l=this._shouldRender(i,this.getPointer(e));i||!c?this._maybeGroupObjects(e):(this._groupSelector=null,this._currentTransform=null),i&&(i.isMoving=!1),this._setCursorFromEvent(e,i),this._handleEvent(e,"up",i?i:null,o,c),i&&(i.__corner=0),l&&this.requestRenderAll()},_handleEvent:function(t,e,i,r,n){var s="undefined"==typeof i?this.findTarget(t):i,a=this.targets||[],h={e:t,target:s,subTargets:a,button:r||o,isClick:n||!1};this.fire("mouse:"+e,h),s&&s.fire("mouse"+e,h);for(var c=0;c1)){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)}},__onMouseWheel:function(t){this._handleEvent(t,"wheel")},_transformObject:function(t){var e=this.getPointer(t),i=this._currentTransform;i.reset=!1,i.target.isMoving=!0,i.shiftKey=t.shiftKey,i.altKey=t[this.centeredKey],this._beforeScaleTransform(t,i),this._performTransformAction(t,i,e),i.actionPerformed&&this.requestRenderAll()},_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=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 this._isUniscalePossible(t,e.target)?(e.currentAction="scale",this._scaleObject(i,r)):(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally"))},_isUniscalePossible:function(t,e){return(t[this.uniScaleKey]||this.uniScaleTransform)&&!e.get("lockUniScaling")},_setCursorFromEvent:function(t,e){if(!e)return this.setCursor(this.defaultCursor),!1;var i=e.hoverCursor||this.hoverCursor,r=this._activeObject&&"activeSelection"===this._activeObject.type?this._activeObject:null,n=(!r||!r.contains(e))&&e._findTargetCorner(this.getPointer(t,!0));n?this.setCursor(this.getCornerCursor(n,e,t)):this.setCursor(i)},getCornerCursor:function(t,i,r){return this.actionIsDisabled(t,i,r)?this.notAllowedCursor:t in e?this._getRotatedCornerCursor(t,i,r):"mtr"===t&&i.hasRotatingPoint?this.rotationCursor:this.defaultCursor},actionIsDisabled:function(t,e,i){return"mt"===t||"mb"===t?i[this.altActionKey]?e.lockSkewingX:e.lockScalingY:"ml"===t||"mr"===t?i[this.altActionKey]?e.lockSkewingY:e.lockScalingX:"mtr"===t?e.lockRotation:this._isUniscalePossible(i,e)?e.lockScalingX&&e.lockScalingY:e.lockScalingX||e.lockScalingY},_getRotatedCornerCursor:function(t,i,r){var n=Math.round(i.angle%360/45);return n<0&&(n+=8),n+=e[t],r[this.altActionKey]&&e[t]%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._activeObject;return t[this.selectionKey]&&e&&e.selectable&&this.selection&&(i!==e||"activeSelection"===i.type)},_handleGrouping:function(t,e){var i=this._activeObject;0===i.__corner&&(e!==i||(e=this.findTarget(t,!0)))&&(i&&"activeSelection"===i.type?this._updateActiveSelection(e,t):this._createActiveSelection(e,t))},_updateActiveSelection:function(t,e){var i=this._activeObject;if(i.contains(t)){if(i.removeWithUpdate(t),1===i.size())return void this.setActiveObject(i.item(0),e)}else i.addWithUpdate(t);this.fire("selection:created",{target:i,e:e})},_createActiveSelection:function(t,e){var i=this._createGroup(t);this.setActiveObject(i,e),this.fire("selection:created",{target:i,e:e})},_createGroup:function(t){var e=this.getObjects(),i=e.indexOf(this._activeObject)1&&(e=new fabric.ActiveSelection(e.reverse(),{canvas:this}),this.setActiveObject(e,t),this.fire("selection:created",{target:e,e:t}),this.requestRenderAll())},_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))&&(r.push(i),l))););return r},_maybeGroupObjects:function(t){this.selection&&this._groupSelector&&this._groupSelectedObjects(t),this.setCursor(this.defaultCursor),this._groupSelector=null,this._currentTransform=null}})}(),function(){var t=fabric.StaticCanvas.supports("toDataURLWithQuality");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||0,top:t.top||0,width:t.width||0,height:t.height||0};return this.__toDataURLWithMultiplier(e,i,n,r)},__toDataURLWithMultiplier:function(t,e,i,r){var n=this.width,s=this.height,o=(i.width||this.width)*r,a=(i.height||this.height)*r,h=this.getZoom(),c=h*r,l=this.viewportTransform,u=(l[4]-i.left)*r,f=(l[5]-i.top)*r,d=[c,0,0,c,u,f],g=this.interactive;this.viewportTransform=d,this.interactive&&(this.interactive=!1),n!==o||s!==a?this.setDimensions({width:o,height:a}):this.renderAll();var p=this.__toDataURL(t,e,i);return g&&(this.interactive=g),this.viewportTransform=l,this.setDimensions({width:n,height:s}),p},__toDataURL:function(e,i){var r=this.contextContainer.canvas;"jpg"===e&&(e="jpeg");var n=t?r.toDataURL("image/"+e,i):r.toDataURL("image/"+e);return n},toDataURLWithMultiplier:function(t,e,i){return this.toDataURL({format:t,multiplier:e,quality:i})}})}(),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),n=this,s=this.renderOnAddRemove;return this.renderOnAddRemove=!1,this._enlivenObjects(r.objects,function(t){n.clear(),n._setBgOverlay(r,function(){t.forEach(function(t,e){n.insertAt(t,e)}),n.renderOnAddRemove=s,delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay,n._setOptions(r),n.renderAll(),e&&e()})},i),this}},_setBgOverlay:function(t,e){var i={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!(t.backgroundImage||t.overlayImage||t.background||t.overlay))return void(e&&e());var r=function(){i.backgroundImage&&i.overlayImage&&i.backgroundColor&&i.overlayColor&&e&&e()};this.__setBgOverlay("backgroundImage",t.backgroundImage,i,r),this.__setBgOverlay("overlayImage",t.overlayImage,i,r),this.__setBgOverlay("backgroundColor",t.background,i,r),this.__setBgOverlay("overlayColor",t.overlay,i,r)},__setBgOverlay:function(t,e,i,r){var n=this;return e?void("backgroundImage"===t||"overlayImage"===t?fabric.util.enlivenObjects([e],function(e){n[t]=e[0],i[t]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(t,!0)](e,function(){i[t]=!0,r&&r()})):(i[t]=!0,void(r&&r()))},_enlivenObjects:function(t,e,i){return t&&0!==t.length?void fabric.util.enlivenObjects(t,function(t){e&&e(t)},null,i):void(e&&e([]))},_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.width,e.height=this.height;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.object.clone,n=e.util.toFixed,s=e.util.string.capitalize,o=e.util.degreesToRadians,a=e.StaticCanvas.supports("setLineDash"),h=!e.isLikelyNode,c=2;e.Object||(e.Object=e.util.createClass(e.CommonMethods,{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,objectCaching:h,statefullCache:!1,noScaleCache:!0,dirty:!0,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill globalCompositeOperation shadow clipTo visible backgroundColor skewX skewY fillRule".split(" "),cacheProperties:"fill stroke strokeWidth strokeDashArray width height strokeLineCap strokeLineJoin strokeMiterLimit backgroundColor".split(" "),initialize:function(t){t=t||{},t&&this.setOptions(t)},_createCacheCanvas:function(){this._cacheProperties={},this._cacheCanvas=e.document.createElement("canvas"),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas()},_limitCacheSize:function(t){var i=e.perfLimitSizeTotal,r=e.cacheSideLimit,n=t.width,s=t.height,o=n/s,a=e.util.limitDimsByArea(o,i,r),h=e.util.capValue,c=e.maxCacheSideLimit,l=e.minCacheSideLimit,u=h(l,a.x,c),f=h(l,a.y,c);return n>u?(t.zoomX/=n/u,t.width=u):nf?(t.zoomY/=s/f,t.height=f):sg||s>p,m=(n<.9*g||s<.9*p)&&g>r&&p>r;d=v||m,v&&(u=.1*n&-2,f=.1*s&-2)}return!!l&&(d?(this._cacheCanvas.width=Math.max(Math.ceil(n)+u,r),this._cacheCanvas.height=Math.max(Math.ceil(s)+f,r),this.cacheTranslationX=(n+u)/2,this.cacheTranslationY=(s+f)/2):(this._cacheContext.setTransform(1,0,0,1,0,0),this._cacheContext.clearRect(0,0,this._cacheCanvas.width,this._cacheCanvas.height)),this.cacheWidth=n,this.cacheHeight=s,this._cacheContext.translate(this.cacheTranslationX,this.cacheTranslationY),this._cacheContext.scale(o,a),this.zoomX=o,this.zoomY=a,!0)},setOptions:function(t){this._setOptions(t),this._initGradient(t.fill,"fill"),this._initGradient(t.stroke,"stroke"),this._initClipping(t),this._initPattern(t.fill,"fill"),this._initPattern(t.stroke,"stroke")},transform:function(t,e){this.group&&!this.group._transformDone&&this.group.transform(t);var i=e?this._getLeftTopCoords():this.getCenterPoint();t.translate(i.x,i.y),this.angle&&t.rotate(o(this.angle)),t.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1)),this.skewX&&t.transform(1,0,Math.tan(o(this.skewX)),1,0,0),this.skewY&&t.transform(1,Math.tan(o(this.skewY)),0,1,0,0)},toObject:function(t){var i=e.Object.NUM_FRACTION_DIGITS,r={type:this.type,originX:this.originX,originY:this.originY,left:n(this.left,i),top:n(this.top,i),width:n(this.width,i),height:n(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:n(this.strokeWidth,i),strokeDashArray:this.strokeDashArray?this.strokeDashArray.concat():this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:n(this.strokeMiterLimit,i),scaleX:n(this.scaleX,i),scaleY:n(this.scaleY,i),angle:n(this.angle,i),flipX:this.flipX,flipY:this.flipY,opacity:n(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():null,skewX:n(this.skewX,i),skewY:n(this.skewY,i)};return e.util.populateWithProperties(this,r,t),this.includeDefaultValues||(r=this._removeDefaultValues(r)),r},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"#"},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}},getObjectOpacity:function(){var t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t},_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?"dirty"===t&&this.group&&this.group.set("dirty",i):i=new e.Shadow(i),this[t]=i,this.cacheProperties.indexOf(t)>-1&&(this.group&&this.group.set("dirty",!0),this.dirty=!0),this.group&&this.stateProperties.indexOf(t)>-1&&this.group.isOnACache()&&this.group.set("dirty",!0),"width"!==t&&"height"!==t||(this.minScaleLimit=Math.min(.1,1/Math.max(this.width,this.height))),this},setOnGroup:function(){},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:e.iMatrix.concat()},isNotVisible:function(){return 0===this.opacity||0===this.width&&0===this.height||!this.visible},render:function(t){this.isNotVisible()||this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),this.transform(t),this._setOpacity(t),this._setShadow(t,this),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.clipTo&&e.util.clipContext(this,t),this.shouldCache()?(this._cacheCanvas||this._createCacheCanvas(),this.isCacheDirty()&&(this.statefullCache&&this.saveState({propertySet:"cacheProperties"}),this.drawObject(this._cacheContext),this.dirty=!1),this.drawCacheOnCanvas(t)):(this.dirty=!1,this.drawObject(t),this.objectCaching&&this.statefullCache&&this.saveState({propertySet:"cacheProperties"})),this.clipTo&&t.restore(),t.restore())},needsItsOwnCache:function(){return!1},shouldCache:function(){return this.ownCaching=this.objectCaching&&(!this.group||this.needsItsOwnCache()||!this.group.isOnACache()),this.ownCaching},willDrawShadow:function(){return!!this.shadow&&(0!==this.shadow.offsetX||0!==this.shadow.offsetY)},drawObject:function(t){this._renderBackground(t),this._setStrokeStyles(t,this),this._setFillStyles(t,this),this._render(t)},drawCacheOnCanvas:function(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheTranslationX,-this.cacheTranslationY)},isCacheDirty:function(t){if(this.isNotVisible())return!1;if(this._cacheCanvas&&!t&&this._updateCacheCanvas())return!0;if(this.dirty||this.statefullCache&&this.hasStateChanged("cacheProperties")){if(this._cacheCanvas&&!t){var e=this.cacheWidth/this.zoomX,i=this.cacheHeight/this.zoomY;this._cacheContext.clearRect(-e/2,-i/2,e,i)}return!0}return!1},_renderBackground:function(t){if(this.backgroundColor){var e=this._getNonTransformedDimensions();t.fillStyle=this.backgroundColor,t.fillRect(-e.x/2,-e.y/2,e.x,e.y),this._removeShadow(t)}},_setOpacity:function(t){this.group&&!this.group.transformDone?t.globalAlpha=this.getObjectOpacity():t.globalAlpha*=this.opacity},_setStrokeStyles:function(t,e){e.stroke&&(t.lineWidth=e.strokeWidth,t.lineCap=e.strokeLineCap,t.lineJoin=e.strokeLineJoin,t.miterLimit=e.strokeMiterLimit,t.strokeStyle=e.stroke.toLive?e.stroke.toLive(t,this):e.stroke)},_setFillStyles:function(t,e){e.fill&&(t.fillStyle=e.fill.toLive?e.fill.toLive(t,this):e.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),a?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){var r,n,s,a=this.getViewportTransform(),h=this.calcTransformMatrix();i=i||{},n="undefined"!=typeof i.hasBorders?i.hasBorders:this.hasBorders,s="undefined"!=typeof i.hasControls?i.hasControls:this.hasControls,h=e.util.multiplyTransformMatrices(a,h),r=e.util.qrDecompose(h),t.save(),t.translate(r.translateX,r.translateY),t.lineWidth=1*this.borderScaleFactor,this.group||(t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1),i.forActiveSelection?(t.rotate(o(r.angle)),n&&this.drawBordersInGroup(t,r,i)):(t.rotate(o(this.angle)),n&&this.drawBorders(t,i)),s&&this.drawControls(t,i),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)},_applyPatternGradientTransform:function(t,e){if(e.toLive){var i=e.gradientTransform||e.patternTransform,r=-this.width/2+e.offsetX||0,n=-this.height/2+e.offsetY||0;t.translate(r,n),i&&t.transform.apply(t,i)}},_renderFill:function(t){this.fill&&(t.save(),this._applyPatternGradientTransform(t,this.fill),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore())},_renderStroke:function(t){this.stroke&&0!==this.strokeWidth&&(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray,this._renderDashedStroke),this._applyPatternGradientTransform(t,this.stroke),t.stroke(),t.restore())},_findCenterFromElement:function(){return{x:this.left+this.width/2,y:this.top+this.height/2}},_removeTransformMatrix:function(){var t=this._findCenterFromElement();if(this.transformMatrix){var i=e.util.qrDecompose(this.transformMatrix);this.flipX=!1,this.flipY=!1,this.set("scaleX",i.scaleX),this.set("scaleY",i.scaleY),this.angle=i.angle,this.skewX=i.skewX,this.skewY=0,t=e.util.transformPoint(t,this.transformMatrix)}this.transformMatrix=null,this.setPositionByOrigin(t,"center","center")},clone:function(t,i){var r=this.toObject(i);this.constructor.fromObject?this.constructor.fromObject(r,t):e.Object._fromObject("Object",r,t)},cloneAsImage:function(t,i){var r=this.toDataURL(i);return e.util.loadImage(r,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,{enableRetinaScaling:t.enableRetinaScaling});"jpg"===t.format&&(t.format="jpeg"),"jpeg"===t.format&&(n.backgroundColor="#fff");var s={active:this.active,left:this.left,top:this.top};this.set("active",!1),this.setPositionByOrigin(new e.Point(n.width/2,n.height/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 1},toJSON:function(t){return this.toObject(t)},setGradient:function(t,i){i||(i={});var r={colorStops:[]};return 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),r.gradientTransform=i.gradientTransform,e.Gradient.prototype.addColorStop.call(r,i.colorStops),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,o(-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.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._fromObject=function(t,i,n,s){var o=e[t];i=r(i,!0),e.util.enlivenPatterns([i.fill,i.stroke],function(t){"undefined"!=typeof t[0]&&(i.fill=t[0]),"undefined"!=typeof t[1]&&(i.stroke=t[1]);var e=s?new o(i[s],i):new o(i);n&&n(e)})},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.getScaledWidth(),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")},onDeselect:function(){}})}(),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,aCoords:null,getCoords:function(e,i){this.oCoords||this.setCoords();var r=e?this.aCoords:this.oCoords;return t(i?this.calcCoords(e):r)},intersectsWithRect:function(t,e,i,r){var n=this.getCoords(i,r),s=fabric.Intersection.intersectPolygonRectangle(n,t,e);return"Intersection"===s.status},intersectsWithObject:function(t,e,i){var r=fabric.Intersection.intersectPolygonPolygon(this.getCoords(e,i),t.getCoords(e,i));return"Intersection"===r.status||t.isContainedWithinObject(this,e,i)||this.isContainedWithinObject(t,e,i)},isContainedWithinObject:function(t,e,i){for(var r=this.getCoords(e,i),n=0,s=t._getImageLines(i?t.calcCoords(e):e?t.aCoords:t.oCoords);n<4;n++)if(!t.containsPoint(r[n],s))return!1;return!0},isContainedWithinRect:function(t,e,i,r){var n=this.getBoundingRect(i,r);return n.left>=t.x&&n.left+n.width<=e.x&&n.top>=t.y&&n.top+n.height<=e.y},containsPoint:function(t,e,i,r){var e=e||this._getImageLines(r?this.calcCoords(i):i?this.aCoords:this.oCoords),n=this._findCrossPoints(t,e);return 0!==n&&n%2===1},isOnScreen:function(t){if(!this.canvas)return!1;for(var e,i=this.canvas.vptCoords.tl,r=this.canvas.vptCoords.br,n=this.getCoords(!0,t),s=0;s<4;s++)if(e=n[s],e.x<=r.x&&e.x>=i.x&&e.y<=r.y&&e.y>=i.y)return!0;if(this.intersectsWithRect(i,r,!0))return!0;var o={x:(i.x+r.x)/2,y:(i.y+r.y)/2};return!!this.containsPoint(o,null,!0)},_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=0;for(var c in e)if(a=e[c],!(a.o.y=t.y&&a.d.y>=t.y||(a.o.x===a.d.x&&a.o.x>=t.x?o=a.o.x:(i=0,r=(a.d.y-a.o.y)/(a.d.x-a.o.x),n=t.y-i*t.x,s=a.o.y-r*a.o.x,o=-(n-s)/(i-r)),o>=t.x&&(h+=1),2!==h)))break;return h},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(t,e){var i=this.getCoords(t,e);return fabric.util.makeBoundingBoxFromPoints(i)},getScaledWidth:function(){return this._getTransformedDimensions().x},getScaledHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)0?Math.atan(o/s):0,l=s/Math.cos(c)/2,u=Math.cos(c+i)*l,f=Math.sin(c+i)*l,d=this.getCenterPoint(),g=t?d:fabric.util.transformPoint(d,r),p=new fabric.Point(g.x-u,g.y-f),v=new fabric.Point(p.x+s*h,p.y+s*a),m=new fabric.Point(p.x-o*a,p.y+o*h),b=new fabric.Point(g.x+u,g.y+f);if(!t)var _=new fabric.Point((p.x+m.x)/2,(p.y+m.y)/2),y=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point((b.x+v.x)/2,(b.y+v.y)/2),C=new fabric.Point((b.x+m.x)/2,(b.y+m.y)/2),S=new fabric.Point(y.x+a*this.rotatingPointOffset,y.y-h*this.rotatingPointOffset);var g={tl:p,tr:v,br:b,bl:m};return t||(g.ml=_,g.mt=y,g.mr=x,g.mb=C,g.mtr=S),g},setCoords:function(t,e){return this.oCoords=this.calcCoords(t),e||(this.aCoords=this.calcCoords(!0)),t||this._setCornerCoords&&this._setCornerCoords(),this},_calcRotateMatrix:function(){if(this.angle){var t=e(this.angle),i=Math.cos(t),r=Math.sin(t);return 6.123233995736766e-17!==i&&i!==-1.8369701987210297e-16||(i=0),[i,r,-r,i,0,0]}return fabric.iMatrix.concat()},calcTransformMatrix:function(t){var e,r,n=this.getCenterPoint(),s=[1,0,0,1,n.x,n.y],o=this._calcDimensionsTransformMatrix(this.skewX,this.skewY,!0);return r=this.group&&!t?i(this.group.calcTransformMatrix(),s):s,this.angle&&(e=this._calcRotateMatrix(),r=i(r,e)),r=i(r,o)},_calcDimensionsTransformMatrix:function(t,r,n){var s,o=this.scaleX*(n&&this.flipX?-1:1),a=this.scaleY*(n&&this.flipY?-1:1),h=[o,0,0,a,0,0];return t&&(s=[1,0,Math.tan(e(t)),1],h=i(h,s,!0)),r&&(s=[1,Math.tan(e(r)),0,1],h=i(h,s,!0)),h},_getNonTransformedDimensions:function(){var t=this.strokeWidth,e=this.width+t,i=this.height+t;return{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')},_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}})}(),function(){function t(t,e,r){var n={},s=!0;r.forEach(function(e){n[e]=t[e]}),i(t[e],n,s)}function e(t,i,r){if(t===i)return!0;if(Array.isArray(t)){if(t.length!==i.length)return!1;for(var n=0,s=t.length;n\n'),t?t(e.join("")):e.join("")}}),i.Line.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),i.Line.fromElement=function(t,e,n){n=n||{};var s=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),o=[s.x1||0,s.y1||0,s.x2||0,s.y2||0];n.originX="left",n.originY="top",e(new i.Line(o,r(s,n)))},i.Line.fromObject=function(t,e){function r(t){delete t.points,e&&e(t)}var s=n(t,!0);s.points=[t.x1,t.y1,t.x2,t.y2],i.Object._fromObject("Line",s,r,"points")}}("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;if(i.Circle)return void i.warn("fabric.Circle is already defined.");var s=i.Object.prototype.cacheProperties.concat();s.push("radius"),i.Circle=i.util.createClass(i.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*r,cacheProperties:s,initialize:function(t){this.callSuper("initialize",t),this.set("radius",t&&t.radius||0)},_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,n=0,s=(this.endAngle-this.startAngle)%(2*r);if(0===s)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){t.beginPath(),t.arc(0,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)}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r,s){s||(s={});var o=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(o))throw new Error("value of `r` attribute is required and can not be negative");o.left=(o.left||0)-o.radius,o.top=(o.top||0)-o.radius,o.originX="left",o.originY="top",r(new i.Circle(n(o,s)))},i.Circle.fromObject=function(t,e){return i.Object._fromObject("Circle",t,e)}}("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){this.callSuper("initialize",t),this.set("width",t&&t.width||100).set("height",t&&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("")}}),void(e.Triangle.fromObject=function(t,i){return e.Object._fromObject("Triangle",t,i)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=2*Math.PI,r=e.util.object.extend;if(e.Ellipse)return void e.warn("fabric.Ellipse is already defined.");var n=e.Object.prototype.cacheProperties.concat();n.push("rx","ry"),e.Ellipse=e.util.createClass(e.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:n,initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&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 this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,r=0;return e.push("\n'),t?t(e.join("")):e.join("")},_render:function(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,i,!1),t.restore(),this._renderFill(t),this._renderStroke(t)}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i,n){n||(n={});var s=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);s.left=(s.left||0)-s.rx,s.top=(s.top||0)-s.ry,s.originX="left",s.originY="top",i(new e.Ellipse(r(s,n)))},e.Ellipse.fromObject=function(t,i){return e.Object._fromObject("Ellipse",t,i)}}("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");var n=e.Object.prototype.cacheProperties.concat();n.push("rx","ry"),e.Rect=e.util.createClass(e.Object,{stateProperties:r,type:"rect",rx:0,ry:0,cacheProperties:n,initialize:function(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){if(1===this.width&&1===this.height)return void t.fillRect(-.5,-.5,1,1);var e=this.rx?Math.min(this.rx,this.width/2):0,i=this.ry?Math.min(this.ry,this.height/2):0,r=this.width,n=this.height,s=-this.width/2,o=-this.height/2,a=0!==e||0!==i,h=.4477152502;t.beginPath(),t.moveTo(s+e,o),t.lineTo(s+r-e,o),a&&t.bezierCurveTo(s+r-h*e,o,s+r,o+h*i,s+r,o+i),t.lineTo(s+r,o+n-i),a&&t.bezierCurveTo(s+r,o+n-h*i,s+r-h*e,o+n,s+r-e,o+n),t.lineTo(s+e,o+n),a&&t.bezierCurveTo(s+h*e,o+n,s,o+n-h*i,s,o+n-i),t.lineTo(s,o+i),a&&t.bezierCurveTo(s,o+h*i,s+h*e,o,s+e,o),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){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=-this.width/2,r=-this.height/2;return e.push("\n'),t?t(e.join("")):e.join("")}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r,n){if(!t)return r(null);n=n||{};var s=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);s.left=s.left||0,s.top=s.top||0,s.originX="left",s.originY="top";var o=new e.Rect(i(n?e.util.object.clone(n):{},s));o.visible=o.visible&&o.width>0&&o.height>0,r(o)},e.Rect.fromObject=function(t,i){return e.Object._fromObject("Rect",t,i)}}("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.toFixed,o=e.Object.NUM_FRACTION_DIGITS;if(e.Polyline)return void e.warn("fabric.Polyline is already defined");var a=e.Object.prototype.cacheProperties.concat();a.push("points"),e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,minX:0,minY:0,cacheProperties:a,initialize:function(t,e){e=e||{},this.points=t||[],this.callSuper("initialize",e),this._calcDimensions(),"top"in e||(this.top=this.minY),"left"in e||(this.left=this.minX),this.pathOffset={x:this.minX+this.width/2,y:this.minY+this.height/2}},_calcDimensions:function(){var t=this.points,e=r(t,"x"),i=r(t,"y"),s=n(t,"x"),o=n(t,"y");this.width=s-e||0,this.height=o-i||0,this.minX=e||0,this.minY=i||0},toObject:function(t){return i(this.callSuper("toObject",t),{points:this.points.concat()})},toSVG:function(t){for(var e=[],i=this.pathOffset.x,r=this.pathOffset.y,n=this._createBaseSVGMarkup(),a=0,h=this.points.length;a\n'),t?t(n.join("")):n.join("")},commonRender:function(t){var e,i=this.points.length,r=this.pathOffset.x,n=this.pathOffset.y;if(!i||isNaN(this.points[i-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-r,this.points[0].y-n);for(var s=0;s"},toObject:function(t){var e=n(this.callSuper("toObject",t),{path:this.path.map(function(t){return t.slice()}),top:this.top,left:this.left});return e},toDatalessObject:function(t){var e=this.toObject(["sourcePath"].concat(t));return e.sourcePath&&delete e.path,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 m=1,b=n.length;m"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this._calcBounds(),this._updateObjectsCoords(),this.setCoords(),this.dirty=!0,this},removeWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this.setCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this},_onObjectRemoved:function(t){this.dirty=!0,delete t.group},_set:function(t,e){var i=this._objects.length;if(this.useSetOnGroup)for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){var e=this.getObjects().map(function(e){var i=e.includeDefaultValues;e.includeDefaultValues=e.group.includeDefaultValues;var r=e.toObject(t);return e.includeDefaultValues=i,r});return i(this.callSuper("toObject",t),{objects:e})},toDatalessObject:function(t){var e,r=this.sourcePath;return e=r?r:this.getObjects().map(function(e){var i=e.includeDefaultValues;e.includeDefaultValues=e.group.includeDefaultValues;var r=e.toDatalessObject(t);return e.includeDefaultValues=i,r}),i(this.callSuper("toDatalessObject",t),{objects:e})},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},shouldCache:function(){var t=this.objectCaching&&(!this.group||this.needsItsOwnCache()||!this.group.isOnACache());if(this.ownCaching=t,t)for(var e=0,i=this._objects.length;e\n');for(var i=0,r=this._objects.length;i\n"),t?t(e.join("")):e.join("")}}),e.Group.fromObject=function(t,i){e.util.enlivenObjects(t.objects,function(r){var n=e.util.object.clone(t,!0);delete n.objects,i&&i(new e.Group(r,n,!0))})})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});e.ActiveSelection||(e.ActiveSelection=e.util.createClass(e.Group,{type:"activeSelection",initialize:function(t,i){i=i||{},this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;i.originX&&(this.originX=i.originX),i.originY&&(this.originY=i.originY),this._calcBounds(),this._updateObjectsCoords(),e.Object.prototype.initialize.call(this,i),this.setCoords()},toGroup:function(){var t=this._objects;this._objects=[];var i=this.toObject(),r=new e.Group([]);if(r.set(i),r.type="group",t.forEach(function(t){t.group=r,t.canvas.remove(t)}),r._objects=t,!this.canvas)return r;var n=this.canvas;return n._activeObject=r,n.add(r),r.setCoords(),r},onDeselect:function(){return this.destroy(),!1},toString:function(){return"#"},_set:function(t,i){var r=this._objects.length;if("canvas"===t)for(;r--;)this._objects[r].set(t,i);if(this.useSetOnGroup)for(;r--;)this._objects[r].setOnGroup(t,i);e.Object.prototype._set.call(this,t,i)},shouldCache:function(){return!1},willDrawShadow:function(){if(this.shadow)return this.callSuper("willDrawShadow");for(var t=0,e=this._objects.length;t\n',"\t\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(t){var e=t?this._element:this._originalElement;return e?fabric.isLikelyNode?e._src:e.src:this.src||""},setSrc:function(t,e,i){return fabric.util.loadImage(t,function(t){this.setElement(t,i),e(this)},this,i&&i.crossOrigin),this},toString:function(){return'#'},applyResizeFilters:function(){var t=this.resizeFilter,e=this.canvas?this.canvas.getRetinaScaling():1,i=this.minimumScaleTrigger,r=this.scaleX=1&&n>=1)return void(this._element=this._filteredEl);fabric.filterBackend||(fabric.filterBackend=fabric.initFilterBackend());var s,o=this._filteredEl||this._originalElement;if(this._element===this._originalElement){var a=fabric.util.createCanvasElement();a.width=o.width,a.height=o.height,this._element=a}var h=this._element.getContext("2d");o.getContext?s=o.getContext("2d").getImageData(0,0,o.width,o.height):(h.drawImage(o,0,0),s=h.getImageData(0,0,o.width,o.height));var c={imageData:s,scaleX:r,scaleY:n};t.applyTo2d(c),this.width=this._element.width=c.imageData.width,this.height=this._element.height=c.imageData.height,h.putImageData(c.imageData,0,0)},applyFilters:function(t){if(t=t||this.filters||[],t=t.filter(function(t){return t}),0===t.length)return this._element=this._originalElement,this._filterScalingX=1,this._filterScalingY=1,this;var e=this._originalElement,i=e.naturalWidth||e.width,r=e.naturalHeight||e.height;if(this._element===this._originalElement){var n=fabric.util.createCanvasElement();n.width=e.width,n.height=e.height,this._element=n}else this._element.getContext("2d").clearRect(0,0,i,r);return fabric.filterBackend||(fabric.filterBackend=fabric.initFilterBackend()),fabric.filterBackend.applyFilters(t,this._originalElement,i,r,this._element,this.cacheKey),this.width===this._element.width&&this.height===this._element.height||(this._filterScalingX=this._element.width/this.width,this._filterScalingY=this._element.height/this.height,this.width=this._element.width,this.height=this._element.height),this},_render:function(t){var e,i=-this.width/2,r=-this.height/2;this.isMoving===!1&&this.resizeFilter&&this._needsResize()&&(this._lastScaleX=this.scaleX,this._lastScaleY=this.scaleY,this.applyResizeFilters()),e=this._element,e&&t.drawImage(e,this.cropX,this.cropY,this.width,this.height,i,r,this.width,this.height),this._stroke(t),this._renderStroke(t)},_needsResize:function(){return this.scaleX!==this._lastScaleX||this.scaleY!==this._lastScaleY},_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),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},parsePreserveAspectRatioAttribute:function(){if(this.preserveAspectRatio){var t,e=fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio),i=this._element.width,r=this._element.height,n=this.width,s=this.height,o={width:n,height:s};!e||"none"===e.alignX&&"none"===e.alignY?(this.scaleX=n/i,this.scaleY=s/r):("meet"===e.meetOrSlice&&(this.width=i,this.height=r,this.scaleX=this.scaleY=t=fabric.util.findScaleToFit(this._element,o),"Mid"===e.alignX&&(this.left+=(n-i*t)/2),"Max"===e.alignX&&(this.left+=n-i*t),"Mid"===e.alignY&&(this.top+=(s-r*t)/2),"Max"===e.alignY&&(this.top+=s-r*t)),"slice"===e.meetOrSlice&&(this.scaleX=this.scaleY=t=fabric.util.findScaleToCover(this._element,o),this.width=n/t,this.height=s/t,"Mid"===e.alignX&&(this.cropX=(i-this.width)/2),"Max"===e.alignX&&(this.cropX=i-this.width),"Mid"===e.alignY&&(this.cropY=(r-this.height)/2),"Max"===e.alignY&&(this.cropY=r-this.height)))}}}),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,r){return r?void(e&&e(null,r)):void fabric.Image.prototype._initFilters.call(t,t.filters,function(r){t.filters=r||[],fabric.Image.prototype._initFilters.call(t,[t.resizeFilter],function(r){t.resizeFilter=r[0];var n=new fabric.Image(i,t);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 crossOrigin".split(" ")),fabric.Image.fromElement=function(t,i,r){var n=fabric.parseAttributes(t,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(n["xlink:href"],i,e(r?fabric.util.object.clone(r):{},n))}}("undefined"!=typeof exports?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var t=this.angle%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.requestRenderAll(),this},fxStraightenObject:function(t){return t.fxStraighten({onChange:this.requestRenderAllBound}),this}}),function(){"use strict";function t(t){t&&t.tileSize&&(this.tileSize=t.tileSize),this.setupGLContext(this.tileSize,this.tileSize),this.captureGPUInfo()}fabric.isWebglSupported=function(t){if(fabric.isLikelyNode)return!1;t=t||fabric.WebglFilterBackend.prototype.tileSize;var e=document.createElement("canvas"),i=e.getContext("webgl")||e.getContext("experimental-webgl"),r=!1;return i&&(fabric.maxTextureSize=i.getParameter(i.MAX_TEXTURE_SIZE),r=fabric.maxTextureSize>=t),this.isSupported=r,r},fabric.WebglFilterBackend=t,t.prototype={tileSize:2048,resources:{},setupGLContext:function(t,e){this.dispose(),this.createWebGLCanvas(t,e),this.squareVertices=new Float32Array([0,0,0,1,1,0,1,1]),this.chooseFastestCopyGLTo2DMethod(t,e)},chooseFastestCopyGLTo2DMethod:function(t,e){var i,r="undefined"!=typeof window.performance;try{new ImageData(1,1),i=!0}catch(t){i=!1}var n="undefined"!=typeof ArrayBuffer,s="undefined"!=typeof Uint8ClampedArray;if(r&&i&&n&&s){var o,a,h,c=fabric.util.createCanvasElement(),l=new ArrayBuffer(t*e*4),u={imageBuffer:l};c.width=t,c.height=e,o=window.performance.now(),copyGLTo2DDrawImage.call(u,this.gl,c),a=window.performance.now()-o,o=window.performance.now(),copyGLTo2DPutImageData.call(u,this.gl,c),h=window.performance.now()-o,a>h?(this.imageBuffer=l,this.copyGLTo2D=copyGLTo2DPutImageData):this.copyGLTo2D=copyGLTo2DDrawImage}},createWebGLCanvas:function(t,e){var i=fabric.util.createCanvasElement();i.width=t,i.height=e;var r={premultipliedAlpha:!1},n=i.getContext("webgl",r);n||(n=i.getContext("experimental-webgl",r)),n&&(n.clearColor(0,0,0,0),this.canvas=i,this.gl=n)},applyFilters:function(t,e,i,r,n,s){var o,a=this.gl;s&&(o=this.getCachedTexture(s,e));var h={originalWidth:e.width||e.originalWidth,originalHeight:e.height||e.originalHeight,sourceWidth:i,sourceHeight:r,context:a,sourceTexture:this.createTexture(a,i,r,!o&&e),targetTexture:this.createTexture(a,i,r),originalTexture:o||this.createTexture(a,i,r,!o&&e),passes:t.length,webgl:!0,squareVertices:this.squareVertices,programCache:this.programCache,pass:0,filterBackend:this},c=a.createFramebuffer();return a.bindFramebuffer(a.FRAMEBUFFER,c),t.forEach(function(t){t&&t.applyTo(h)}),this.copyGLTo2D(a,n),a.bindTexture(a.TEXTURE_2D,null),a.deleteTexture(h.sourceTexture),a.deleteTexture(h.targetTexture),a.deleteFramebuffer(c),n.getContext("2d").setTransform(1,0,0,1,0,0),h},applyFiltersDebug:function(t,e,i,r,n,s){var o=this.gl,a=this.applyFilters(t,e,i,r,n,s),h=o.getError();if(h!==o.NO_ERROR){var c=this.glErrorToString(o,h),l=new Error("WebGL Error "+c);throw l.glErrorCode=h,l}return a},glErrorToString:function(t,e){if(!t)return"Context undefined for error code: "+e;if("number"!=typeof e)return"Error code is not a number";switch(e){case t.NO_ERROR:return"NO_ERROR";case t.INVALID_ENUM:return"INVALID_ENUM";case t.INVALID_VALUE:return"INVALID_VALUE";case t.INVALID_OPERATION:return"INVALID_OPERATION";case t.INVALID_FRAMEBUFFER_OPERATION:return"INVALID_FRAMEBUFFER_OPERATION";case t.OUT_OF_MEMORY:return"OUT_OF_MEMORY";case t.CONTEXT_LOST_WEBGL:return"CONTEXT_LOST_WEBGL";default:return"UNKNOWN_ERROR"}},dispose:function(){this.canvas&&(this.canvas=null,this.gl=null),this.clearWebGLCaches()},clearWebGLCaches:function(){this.programCache={},this.textureCache={}},createTexture:function(t,e,i,r){var n=t.createTexture();return t.bindTexture(t.TEXTURE_2D,n),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),r?t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,r):t.texImage2D(t.TEXTURE_2D,0,t.RGBA,e,i,0,t.RGBA,t.UNSIGNED_BYTE,null),n},getCachedTexture:function(t,e){if(this.textureCache[t])return this.textureCache[t];var i=this.createTexture(this.gl,e.width,e.height,e);return this.textureCache[t]=i,i},evictCachesForKey:function(t){this.textureCache[t]&&(this.gl.deleteTexture(this.textureCache[t]),delete this.textureCache[t])},copyGLTo2D:copyGLTo2DDrawImage,captureGPUInfo:function(){if(this.gpuInfo)return this.gpuInfo;var t=this.gl,e=t.getExtension("WEBGL_debug_renderer_info"),i={renderer:"",vendor:""};if(e){var r=t.getParameter(e.UNMASKED_RENDERER_WEBGL),n=t.getParameter(e.UNMASKED_VENDOR_WEBGL);r&&(i.renderer=r.toLowerCase()),n&&(i.vendor=n.toLowerCase())}return this.gpuInfo=i,i}}}(),function(){"use strict";function t(){}var e=function(){};fabric.Canvas2dFilterBackend=t,t.prototype={evictCachesForKey:e,dispose:e,clearWebGLCaches:e,resources:{},applyFilters:function(t,e,i,r,n){var s=n.getContext("2d");s.drawImage(e,0,0,i,r);var o=s.getImageData(0,0,i,r),a=s.getImageData(0,0,i,r),h={sourceWidth:i,sourceHeight:r,imageData:o,originalEl:e,originalImageData:a,canvasEl:n,ctx:s,filterBackend:this};return t.forEach(function(t){t.applyTo(h)}),h.imageData.width===i&&h.imageData.height===r||(n.width=h.imageData.width,n.height=h.imageData.height),s.putImageData(h.imageData,0,0),h}}}(),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",vertexSource:"attribute vec2 aPosition;\nattribute vec2 aTexCoord;\nvarying vec2 vTexCoord;\nvoid main() {\nvTexCoord = aTexCoord;\ngl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n}",fragmentSource:"precision highp float;\nvarying vec2 vTexCoord;\nuniform sampler2d uTexture;\nvoid main() {\ngl_FragColor = texture2D(uTexture, vTexCoord);\n}",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},createProgram:function(t,e,i){if(this.vertexSource&&this.fragmentSource){var r=t.createShader(t.VERTEX_SHADER);if(t.shaderSource(r,i||this.vertexSource),t.compileShader(r),!t.getShaderParameter(r,t.COMPILE_STATUS))throw new Error('Vertex shader compile error for "${this.type}": '+t.getShaderInfoLog(r));var n=t.createShader(t.FRAGMENT_SHADER);if(t.shaderSource(n,e||this.fragmentSource),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new Error('Fragment shader compile error for "${this.type}": '+t.getShaderInfoLog(n));var s=t.createProgram();if(t.attachShader(s,r),t.attachShader(s,n),t.linkProgram(s),!t.getProgramParameter(s,t.LINK_STATUS))throw new Error('Shader link error for "${this.type}" '+t.getProgramInfoLog(s));var o=this.getAttributeLocations(t,s),a=this.getUniformLocations(t,s)||{};return a.uStepW=t.getUniformLocation(s,"uStepW"),a.uStepH=t.getUniformLocation(s,"uStepH"),{program:s,attributeLocations:o,uniformLocations:a}}},getAttributeLocations:function(t,e){return{aPosition:t.getAttribLocation(e,"aPosition"),aTexCoord:t.getAttribLocation(e,"aTexCoord")}},getUniformLocations:function(){},sendAttributeData:function(t,e,i){["aPosition","aTexCoord"].forEach(function(r){var n=e[r],s=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,s),t.enableVertexAttribArray(n),t.vertexAttribPointer(n,2,t.FLOAT,!1,0,0),t.bufferData(t.ARRAY_BUFFER,i,t.STATIC_DRAW)})},_setupFrameBuffer:function(t){var e=t.context;t.passes>1?e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t.targetTexture,0):(e.bindFramebuffer(e.FRAMEBUFFER,null),e.finish())},_swapTextures:function(t){t.passes--,t.pass++;var e=t.targetTexture;t.targetTexture=t.sourceTexture,t.sourceTexture=e},isNeutralState:function(){return!1},applyTo:function(t){if(t.webgl){if(t.passes>1&&this.isNeutralState(t))return;this._setupFrameBuffer(t),this.applyToWebGL(t),this._swapTextures(t)}else this.applyTo2d(t)},retrieveShader:function(t){return t.programCache.hasOwnProperty(this.type)||(t.programCache[this.type]=this.createProgram(t.context)),t.programCache[this.type]},applyToWebGL:function(t){var e=t.context,i=this.retrieveShader(t);0===t.pass&&t.originalTexture?e.bindTexture(e.TEXTURE_2D,t.originalTexture):e.bindTexture(e.TEXTURE_2D,t.sourceTexture),e.useProgram(i.program),this.sendAttributeData(e,i.attributeLocations,t.squareVertices),e.uniform1f(i.uniformLocations.uStepW,1/t.sourceWidth),e.uniform1f(i.uniformLocations.uStepH,1/t.sourceHeight),this.sendUniformData(e,i.uniformLocations),e.viewport(0,0,t.sourceWidth,t.sourceHeight),e.drawArrays(e.TRIANGLE_STRIP,0,4)},bindAdditionalTexture:function(t,e,i){t.activeTexture(i),t.bindTexture(t.TEXTURE_2D,e),t.activeTexture(t.TEXTURE0)},unbindAdditionalTexture:function(t,e){t.activeTexture(e),t.bindTexture(t.TEXTURE_2D,null),t.activeTexture(t.TEXTURE0)},getMainParameter:function(){return this[this.mainParameter]},setMainParameter:function(t){this[this.mainParameter]=t},sendUniformData:function(){},createHelpLayer:function(t){if(!t.helpLayer){var e=document.createElement("canvas");e.width=t.sourceWidth,e.height=t.sourceHeight,t.helpLayer=e}},toObject:function(){var t={type:this.type},e=this.mainParameter;return e&&(t[e]=this[e]),t},toJSON:function(){return this.toObject()}}),fabric.Image.filters.BaseFilter.fromObject=function(t,e){var i=new fabric.Image.filters[t.type](t);return e&&e(i),i},function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.ColorMatrix=r(i.BaseFilter,{type:"ColorMatrix",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nvarying vec2 vTexCoord;\nuniform mat4 uColorMatrix;\nuniform vec4 uConstants;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\ncolor *= uColorMatrix;\ncolor += uConstants;\ngl_FragColor = color;\n}",matrix:[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],mainParameter:"matrix",colorsOnly:!0,initialize:function(t){this.callSuper("initialize",t),this.matrix=this.matrix.slice(0)},applyTo2d:function(t){var e,i,r,n,s,o=t.imageData,a=o.data,h=a.length,c=this.matrix,l=this.colorsOnly;for(s=0;sy||o<0||o>_||(h=4*(a*_+o),c=v[d*m+f],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,S||(n+=p[h+3]*c));C[s]=e,C[s+1]=i,C[s+2]=r,S?C[s+3]=p[s+3]:C[s+3]=n}t.imageData=x},getUniformLocations:function(t,e){return{uMatrix:t.getUniformLocation(e,"uMatrix"),uOpaque:t.getUniformLocation(e,"uOpaque"),uHalfSize:t.getUniformLocation(e,"uHalfSize"),uSize:t.getUniformLocation(e,"uSize")}},sendUniformData:function(t,e){t.uniform1fv(e.uMatrix,this.matrix)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Grayscale=r(i.BaseFilter,{type:"Grayscale",fragmentSource:{average:"precision highp float;\nuniform sampler2D uTexture;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nfloat average = (color.r + color.b + color.g) / 3.0;\ngl_FragColor = vec4(average, average, average, color.a);\n}",lightness:"precision highp float;\nuniform sampler2D uTexture;\nuniform int uMode;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 col = texture2D(uTexture, vTexCoord);\nfloat average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\ngl_FragColor = vec4(average, average, average, col.a);\n}",luminosity:"precision highp float;\nuniform sampler2D uTexture;\nuniform int uMode;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 col = texture2D(uTexture, vTexCoord);\nfloat average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\ngl_FragColor = vec4(average, average, average, col.a);\n}"},mode:"average",mainParameter:"mode",applyTo2d:function(t){var e,i,r=t.imageData,n=r.data,s=n.length,o=this.mode;for(e=0;el[0]&&n>l[1]&&s>l[2]&&rt)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return a(e)*a(i)/e/i}}function f(t){var a,h,u,O,k,D,j,E,P,M,A;for(w.x=(t+.5)*m,T.x=r(w.x),a=0;a=e)){M=r(1e3*s(h-w.x)),S[M]||(S[M]={});for(var L=T.y-C;L<=T.y+C;L++)L<0||L>=o||(A=r(1e3*s(L-w.y)),S[M][A]||(S[M][A]=v(n(i(M*_,2)+i(A*y,2))/1e3)),u=S[M][A],u>0&&(O=4*(L*e+h),k+=u,D+=u*d[O],j+=u*d[O+1],E+=u*d[O+2],P+=u*d[O+3]))}O=4*(a*c+t),p[O]=D/k,p[O+1]=j/k,p[O+2]=E/k,p[O+3]=P/k}return++t1&&L<-1||(y=2*L*L*L-3*L*L+1,y>0&&(A=4*(M+D*e),O+=y*g[A+3],C+=y,g[A+3]<255&&(y=y*g[A+3]/250),S+=y*g[A],w+=y*g[A+1],T+=y*g[A+2],x+=y))}v[_]=S/x,v[_+1]=w/x,v[_+2]=T/x,v[_+3]=O/C}return p},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Contrast=r(i.BaseFilter,{type:"Contrast",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nuniform float uContrast;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nfloat contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\ncolor.rgb = contrastF * (color.rgb - 0.5) + 0.5;\ngl_FragColor = color;\n}",contrast:0,mainParameter:"contrast",applyTo2d:function(t){if(0!==this.contrast){var e,i,r=t.imageData,n=r.data,i=n.length,s=Math.floor(255*this.contrast),o=259*(s+255)/(255*(259-s));for(e=0;e1&&(e=1/this.aspectRatio):this.aspectRatio<1&&(e=this.aspectRatio),t=e*this.blur*.12,this.horizontal?i[0]=t:i[1]=t,i}}),i.Blur.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.Image.filters,r=e.util.createClass;i.Gamma=r(i.BaseFilter,{type:"Gamma",fragmentSource:"precision highp float;\nuniform sampler2D uTexture;\nuniform vec3 uGamma;\nvarying vec2 vTexCoord;\nvoid main() {\nvec4 color = texture2D(uTexture, vTexCoord);\nvec3 correction = (1.0 / uGamma);\ncolor.r = pow(color.r, correction.r);\ncolor.g = pow(color.g, correction.g);\ncolor.b = pow(color.b, correction.b);\ngl_FragColor = color;\ngl_FragColor.rgb *= color.a;\n}",gamma:[1,1,1],mainParameter:"gamma",applyTo2d:function(t){var e,i=t.imageData,r=i.data,n=this.gamma,s=r.length,o=1/n[0],a=1/n[1],h=1/n[2];for(this.rVals||(this.rVals=new Uint8Array(256),this.gVals=new Uint8Array(256),this.bVals=new Uint8Array(256)),e=0,s=256;e'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t},_render:function(t){this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")},_renderText:function(t){this._renderTextFill(t),this._renderTextStroke(t)},_setTextStyles:function(t,e,i){t.textBaseline="alphabetic",t.font=this._getFontDeclaration(e,i)},calcTextWidth:function(){for(var t=this.getLineWidth(0),e=1,i=this._textLines.length;et&&(t=r)}return t},_renderTextLine:function(t,e,i,r,n,s){this._renderChars(t,e,i,r,n,s)},_renderTextLinesBackground:function(t){if(this.textBackgroundColor||this.styleHas("textBackgroundColor")){for(var e,i,r,n,s,o,a=0,h=t.fillStyle,c=this._getLeftOffset(),l=this._getTopOffset(),u=0,f=0,d=0,g=this._textLines.length;ds)){var v=h-s;c[t]=h,c[f]+=v,s=h}return{width:s*g,kernedWidth:h*g}},getHeightOfChar:function(t,e){return this.getValueOfPropertyAt(t,e,"fontSize")},measureLine:function(t){var e=this._measureLine(t);return 0!==this.charSpacing&&(e.width-=this._getWidthOfCharSpacing()),e.width<0&&(e.width=0),e},_measureLine:function(t){var e,i,r,n,s=0,o=this._textLines[t],a=0,h=new Array(o.length);for(this.__charBounds[t]=h,e=0;e0&&!n){var u=this.__charBounds[e][i-1];l.left=u.left+u.width+a.kernedWidth-a.width}return l},getHeightOfLine:function(t){if(this.__lineHeights[t])return this.__lineHeights[t];for(var e=this._textLines[t],i=this.getHeightOfChar(t,0),r=1,n=e.length;ri&&(i=s)}return this.__lineHeights[t]=i*this.lineHeight*this._fontSizeMult,this.__lineHeights[t]},calcTextHeight:function(){for(var t,e=0,i=0,r=this._textLines.length;i0?(t.fillStyle=f,s&&f&&t.fillRect(d+r+o,g+l*(1-this._fontSizeFraction)+this.offsets[e]*this.fontSize,a,this.fontSize/15),o=h.left,a=h.width,s=c,f=u):a+=h.kernedWidth;t.fillStyle=u,c&&u&&t.fillRect(d+r+o,g+l*(1-this._fontSizeFraction)+this.offsets[e]*this.fontSize,a,this.fontSize/15),g+=i}else g+=i;this._removeShadow(t)}},_getFontDeclaration:function(t,i){var r=t||this;return[e.isLikelyNode?r.fontWeight:r.fontStyle,e.isLikelyNode?r.fontStyle:r.fontWeight,i?n+"px":r.fontSize+"px",e.isLikelyNode?'"'+r.fontFamily+'"':r.fontFamily].join(" ")},render:function(t){this.visible&&(this.canvas&&this.canvas.skipOffscreen&&!this.group&&!this.isOnScreen()||(this._shouldClearDimensionCache()&&this.initDimensions(),this.callSuper("render",t)))},_splitTextIntoLines:function(t){for(var i=t.split(this._reNewline),r=new Array(i.length),n=["\n"],s=[],o=0;o-1&&(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,r,n){if(!t)return r(null);var s=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);if(n=e.util.object.extend(n?i(n):{},s),n.top=n.top||0,n.left=n.left||0,s.textDecoration){var o=s.textDecoration;o.indexOf("underline")!==-1&&(n.underline=!0),o.indexOf("overline")!==-1&&(n.overline=!0),o.indexOf("line-through")!==-1&&(n.linethrough=!0),delete n.textDecoration}"dx"in s&&(n.left+=s.dx),"dy"in s&&(n.top+=s.dy),"fontSize"in n||(n.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),n.originX||(n.originX="left");var a="";"textContent"in t?a=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(a=t.firstChild.data),a=a.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var h=new e.Text(a,n),c=h.getScaledHeight()/h.height,l=(h.height+h.strokeWidth)*h.lineHeight-h.height,u=l*c,f=h.getScaledHeight()+u,d=0;"center"===h.originX&&(d=h.getScaledWidth()/2),"right"===h.originX&&(d=h.getScaledWidth()),h.set({left:h.left-d,top:h.top-(f-h.fontSize*(.18+h._fontSizeFraction))/h.lineHeight}),h.originX="left",h.originY="top",r(h)},e.Text.fromObject=function(t,i){return e.Object._fromObject("Text",t,i,"text")},e.util.createAccessors&&e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){function t(t){t.textDecoration&&(t.textDecoration.indexOf("underline")>-1&&(t.underline=!0),t.textDecoration.indexOf("line-through")>-1&&(t.linethrough=!0),t.textDecoration.indexOf("overline")>-1&&(t.overline=!0),delete t.textDecoration)}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,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],inCompositionMode:!1,initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},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;r0?o:0)},this.cursorOffsetCache=i,this.cursorOffsetCache},renderCursor:function(t,e){var i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex>0?i.charIndex-1:0,s=this.getValueOfPropertyAt(r,n,"fontSize"),o=this.scaleX*this.canvas.getZoom(),a=this.cursorWidth/o,h=t.topOffset;h+=(1-this._fontSizeFraction)*this.getHeightOfLine(r)/this.lineHeight-s*(1-this._fontSizeFraction),this.inCompositionMode&&this.renderSelection(t,e),e.fillStyle=this.getValueOfPropertyAt(r,n,"fill"),e.globalAlpha=this.__isMousedown?1:this._currentCursorOpacity,e.fillRect(t.left+t.leftOffset-a/2,h+t.top,a,s)},renderSelection:function(t,e){for(var i=this.inCompositionMode?this.hiddenTextarea.selectionStart:this.selectionStart,r=this.inCompositionMode?this.hiddenTextarea.selectionEnd:this.selectionEnd,n=this.get2DCursorLocation(i),s=this.get2DCursorLocation(r),o=n.lineIndex,a=s.lineIndex,h=n.charIndex<0?0:n.charIndex,c=s.charIndex<0?0:s.charIndex,l=o;l<=a;l++){var u=this._getLineLeftOffset(l)||0,f=this.getHeightOfLine(l),d=0,g=0,p=0;l===o&&(g=this.__charBounds[o][h].left),l>=o&&l1)&&(f/=this.lineHeight),this.inCompositionMode?(e.fillStyle=this.compositionColor||"black",e.fillRect(t.left+u+g,t.top+t.topOffset+f,p-g,1)):(e.fillStyle=this.selectionColor,e.fillRect(t.left+u+g,t.top+t.topOffset,p-g,f)),t.topOffset+=d}},getCurrentCharFontSize:function(){var t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fontSize")},getCurrentCharColor:function(){var t=this._getCurrentCharIndex();return this.getValueOfPropertyAt(t.l,t.c,"fill")},_getCurrentCharIndex:function(){var t=this.get2DCursorLocation(this.selectionStart,!0),e=t.charIndex>0?t.charIndex-1:0;return{l:t.lineIndex,c:e}}}),fabric.IText.fromObject=function(e,i){if(t(e),e.styles)for(var r in e.styles)for(var n in e.styles[r])t(e.styles[r][n]);fabric.Object._fromObject("IText",e,i,"text")}}(),function(){var t=fabric.util.object.clone;fabric.util.object.extend(fabric.IText.prototype,{initBehavior:function(){this.initAddedHandler(),this.initRemovedHandler(),this.initCursorSelectionHandlers(),this.initDoubleClickSimulation(),this.mouseMoveHandler=this.mouseMoveHandler.bind(this)},onDeselect:function(){this.isEditing&&this.exitEditing(),this.selected=!1,this.callSuper("onDeselect")},initAddedHandler:function(){var t=this;this.on("added",function(){var e=t.canvas;e&&(e._hasITextHandlers||(e._hasITextHandlers=!0,t._initCanvasHandlers(e)),e._iTextInstances=e._iTextInstances||[],e._iTextInstances.push(t))})},initRemovedHandler:function(){var t=this;this.on("removed",function(){var e=t.canvas;e&&(e._iTextInstances=e._iTextInstances||[],fabric.util.removeFromArray(e._iTextInstances,t),0===e._iTextInstances.length&&(e._hasITextHandlers=!1,t._removeCanvasHandlers(e)))})},_initCanvasHandlers:function(t){t._mouseUpITextHandler=function(){t._iTextInstances&&t._iTextInstances.forEach(function(t){t.__isMousedown=!1})}.bind(this),t.on("mouse:up",t._mouseUpITextHandler)},_removeCanvasHandlers:function(t){t.off("mouse:up",t._mouseUpITextHandler)},_tick:function(){this._currentTickState=this._animateCursor(this,1,this.cursorDuration,"_onTickComplete")},_animateCursor:function(t,e,i,r){var n;return n={isAborted:!1,abort:function(){this.isAborted=!0}},t.animate("_currentCursorOpacity",e,{duration:i,onComplete:function(){n.isAborted||t[r]()},onChange:function(){t.canvas&&t.selectionStart===t.selectionEnd&&t.renderCursorOrSelection()},abort:function(){return n.isAborted}}),n},_onTickComplete:function(){var t=this;this._cursorTimeout1&&clearTimeout(this._cursorTimeout1),this._cursorTimeout1=setTimeout(function(){t._currentTickCompleteState=t._animateCursor(t,0,this.cursorDuration/2,"_tick")},100)},initDelayedCursor:function(t){var e=this,i=t?0:this.cursorDelay;this.abortCursorAnimation(),this._currentCursorOpacity=1,this._cursorTimeout2=setTimeout(function(){e._tick()},i)},abortCursorAnimation:function(){var t=this._currentTickState||this._currentTickCompleteState;this._currentTickState&&this._currentTickState.abort(),this._currentTickCompleteState&&this._currentTickCompleteState.abort(),clearTimeout(this._cursorTimeout1),clearTimeout(this._cursorTimeout2),this._currentCursorOpacity=0,t&&this.canvas&&this.canvas.clearContext(this.canvas.contextTop||this.ctx)},selectAll:function(){this.selectionStart=0,this.selectionEnd=this._text.length,this._fireSelectionChanged(),this._updateTextarea()},getSelectedText:function(){return this._text.slice(this.selectionStart,this.selectionEnd).join("")},findWordBoundaryLeft:function(t){var e=0,i=t-1;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i--;for(;/\S/.test(this._text[i])&&i>-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this._text[i]))for(;this._reSpace.test(this._text[i]);)e++,i++;for(;/\S/.test(this._text[i])&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this._text[i])&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this.restartCursorIfNeeded(),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},fromStringToGraphemeSelection:function(t,e,i){var r=i.slice(0,t),n=fabric.util.string.graphemeSplit(r).length;if(t===e)return{selectionStart:n,selectionEnd:n};var s=i.slice(t,e),o=fabric.util.string.graphemeSplit(s).length;return{selectionStart:n,selectionEnd:n+o}},fromGraphemeToStringSelection:function(t,e,i){var r=i.slice(0,t),n=r.join("").length;if(t===e)return{selectionStart:n,selectionEnd:n};var s=i.slice(t,e),o=s.join("").length;return{selectionStart:n,selectionEnd:n+o}},_updateTextarea:function(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){var t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}},updateFromTextArea:function(){if(this.hiddenTextarea){this.cursorOffsetCache={},this.text=this.hiddenTextarea.value;var t=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value);this.selectionEnd=this.selectionStart=t.selectionEnd,this.inCompositionMode||(this.selectionStart=t.selectionStart),this.updateTextareaPosition()}},updateTextareaPosition:function(){if(this.selectionStart===this.selectionEnd){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,n=i.charIndex,s=this.getValueOfPropertyAt(r,n,"fontSize")*this.lineHeight,o=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),h.x+=this.canvas._offset.left,h.y+=this.canvas._offset.top,{left:h.x+"px",top:h.y+"px",fontSize:s+"px",charHeight: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.hiddenTextarea.blur&&this.hiddenTextarea.blur(),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]},removeStyleFromTo:function(t,e){var i,r,n=this.get2DCursorLocation(t,!0),s=this.get2DCursorLocation(e,!0),o=n.lineIndex,a=n.charIndex,h=s.lineIndex,c=s.charIndex;if(o!==h){if(this.styles[o])for(i=a;ie&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},restartCursorIfNeeded:function(){this._currentTickState&&!this._currentTickState.isAborted&&this._currentTickCompleteState&&!this._currentTickCompleteState.isAborted||this.initDelayedCursor()},insertNewlineStyleObject:function(e,i,r,n){var s,o={},a=!1;r||(r=1),this.shiftLineStyles(e,r),this.styles[e]&&this.styles[e][i-1]&&(s=this.styles[e][i-1]);for(var h in this.styles[e]){var c=parseInt(h,10);c>=i&&(a=!0,o[c-i]=this.styles[e][h],delete this.styles[e][h])}for(a?this.styles[e+r]=o:delete this.styles[e+r];r>1;)r--,n[r]?this.styles[e+r]={0:t(n[r])}:s?this.styles[e+r]={0:t(s)}:delete this.styles[e+r];this._forceClearCache=!0},insertCharStyleObject:function(e,i,r,n){var s=this.styles[e],o=t(s);r||(r=1);for(var a in o){var h=parseInt(a,10);h>=i&&(s[h+r]=o[h],o[h-r]||delete s[h])}if(this._forceClearCache=!0,s)if(n)for(;r--;)this.styles[e][i+r]=t(n[r]);else for(var c=s[i?i-1:1];c&&r--;)this.styles[e][i+r]=t(c)},insertNewStyleBlock:function(t,e,i){for(var r=this.get2DCursorLocation(e,!0),n=0,s=0,o=0;ot&&it?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),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,t.e)&&(this.fire("tripleclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},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.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("mousedblclick",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&&(!t.e.button||1===t.e.button)){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,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)||t.e.button&&1!==t.e.button||(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),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())},getSelectionStartFromPointer:function(t){for(var e,i,r=this.getLocalPointer(t),n=0,s=0,o=0,a=0,h=0,c=0,l=this._textLines.length;c0&&(a+=this._textLines[c-1].length+1);e=this._getLineLeftOffset(h),s=e*this.scaleX,i=this._textLines[h];for(var u=0,f=i.length;us?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"),this.hiddenTextarea.setAttribute("autocorrect","off"),this.hiddenTextarea.setAttribute("autocomplete","off"),this.hiddenTextarea.setAttribute("spellcheck","false"),this.hiddenTextarea.setAttribute("data-fabric-hiddentextarea",""),this.hiddenTextarea.setAttribute("wrap","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; line-height: 1px; paddingーtop: "+t.fontSize+";",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.copy.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:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown"},ctrlKeysMapUp:{67:"copy",88:"cut"},ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing&&!this.inCompositionMode){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(),t.keyCode>=33&&t.keyCode<=40?(this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone||this.inCompositionMode?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.requestRenderAll()))},onInput:function(t){var e=this.fromPaste;if(this.fromPaste=!1,t&&t.stopPropagation(),this.isEditing){var i,r,n=this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,s=this._text.length,o=n.length,a=o-s;""===this.hiddenTextarea.value&&(this.styles={},this.updateFromTextArea(),this.fire("changed"),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())),this.selectionStart!==this.selectionEnd?(i=this._text.slice(this.selectionStart,this.selectionEnd),a+=this.selectionEnd-this.selectionStart):oh.selectionStart?this.removeStyleFromTo(this.selectionEnd-i.length,this.selectionEnd):this.removeStyleFromTo(this.selectionEnd,this.selectionEnd+i.length)),r.length&&(e&&r.join("")===fabric.copiedText?this.insertNewStyleBlock(r,this.selectionStart,fabric.copiedTextStyle):this.insertNewStyleBlock(r,this.selectionStart)),this.updateFromTextArea(),this.fire("changed"),this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll())}},onCompositionStart:function(){this.inCompositionMode=!0},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){this.compositionStart=t.target.selectionStart,this.compositionEnd=t.target.selectionEnd,this.updateTextareaPosition()},copy:function(){if(this.selectionStart!==this.selectionEnd){var t=this.getSelectedText();fabric.copiedText=t,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),this._copyDone=!0}},paste:function(){this.fromPaste=!0},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},_getWidthBeforeCursor:function(t,e){var i,r=this._getLineLeftOffset(t);return e>0&&(i=this.__charBounds[t][e-1],r+=i.left+i.width),r},getDownCursorOffset:function(t,e){var i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),n=r.lineIndex;if(n===this._textLines.length-1||t.metaKey||34===t.keyCode)return this._text.length-i;var s=r.charIndex,o=this._getWidthBeforeCursor(n,s),a=this._getIndexOnLine(n+1,o),h=this._textLines[n].slice(s);return h.length+a+2},_getSelectionForOffset:function(t,e){return t.shiftKey&&this.selectionStart!==this.selectionEnd&&e?this.selectionEnd:this.selectionStart},getUpCursorOffset:function(t,e){var i=this._getSelectionForOffset(t,e),r=this.get2DCursorLocation(i),n=r.lineIndex;if(0===n||t.metaKey||33===t.keyCode)return-i;var s=r.charIndex,o=this._getWidthBeforeCursor(n,s),a=this._getIndexOnLine(n-1,o),h=this._textLines[n].slice(0,s);return-this._textLines[n-1].length+a-h.length},_getIndexOnLine:function(t,e){for(var i,r,n=this._textLines[t],s=this._getLineLeftOffset(t),o=s,a=0,h=0,c=n.length;he){r=!0;var l=o-i,u=o,f=Math.abs(l-e),d=Math.abs(u-e);a=d=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){var i="get"+t+"CursorOffset",r=this[i](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(r):this.moveCursorWithoutShift(r),0!==r&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(void 0!==typeof r&&this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=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)&&(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=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t){this.selectionStart===this.selectionEnd?this._removeCharsNearCursor(t):this._removeCharsFromTo(this.selectionStart,this.selectionEnd),this.set("dirty",!0),this.setSelectionEnd(this.selectionStart),this._removeExtraneousStyles(),this.canvas&&this.canvas.requestRenderAll(),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.Text.prototype,{toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this._getSVGLeftTopOffsets(),r=this._getSVGTextAndBg(i.textTop,i.textLeft);return this._wrapSVGTextAndBg(e,r),t?t(e.join("")):e.join("")},_getSVGLeftTopOffsets:function(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}},_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=[],s=t;this._setSVGBg(n);for(var o=0,a=this._textLines.length;o",fabric.util.string.escapeXml(i),"\n"].join("")},_setSVGTextLineText:function(t,e,i,r){var n,s,o,a,h,c=this.getHeightOfLine(e),l="",u=0,f=this._textLines[e];r+=c*(1-this._fontSizeFraction)/this.lineHeight;for(var d=0,g=f.length-1;d<=g;d++)h=d===g||this.charSpacing,l+=f[d],o=this.__charBounds[e][d],0===u&&(i+=o.kernedWidth-o.width),u+=o.kernedWidth,"justify"!==this.textAlign||h||this._reSpaceAndTab.test(f[d])&&(h=!0),h||(n=n||this.getCompleteStyleDeclaration(e,d),s=this.getCompleteStyleDeclaration(e,d+1),h=this._hasStyleChanged(n,s)),h&&(a=this._getStyleDeclaration(e,d)||{},t.push(this._createTextCharSpan(l,a,i,r)),l="",n=s,i+=u,u=0)},_pushTextBgRect:function(i,r,n,s,o,a){i.push("\t\t\n')},_setSVGTextLineBg:function(t,e,i,r){for(var n,s,o=this._textLines[e],a=this.getHeightOfLine(e)/this.lineHeight,h=0,c=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),u=0,f=o.length;uthis.width&&this._set("width",this.dynamicMinWidth),"justify"===this.textAlign&&this.enlargeSpaces(),this.height=this.calcTextHeight()}},_generateStyleMap:function(t){for(var e=0,i=0,r=0,n={},s=0;s0?(i=0,r++,e++):this._reSpaceAndTab.test(t.graphemeText[r])&&s>0&&(i++,r++),n[s]={line:e,offset:i},r+=t.graphemeLines[s].length,i+=t.graphemeLines[s].length;return n},styleHas:function(t,i){if(this._styleMap&&!this.isWrapping){var r=this._styleMap[i];r&&(i=r.line)}return e.Text.prototype.styleHas.call(this,t,i)},_getStyleDeclaration:function(t,e){if(this._styleMap&&!this.isWrapping){var i=this._styleMap[t];if(!i)return null;t=i.line,e=i.offset+e}return this.callSuper("_getStyleDeclaration",t,e)},_setStyleDeclaration:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,this.styles[t][e]=i},_deleteStyleDeclaration:function(t,e){var i=this._styleMap[t];t=i.line,e=i.offset+e,delete this.styles[t][e]},_getLineStyle:function(t){var e=this._styleMap[t];return this.styles[e.line]},_setLineStyle:function(t,e){var i=this._styleMap[t];this.styles[i.line]=e},_deleteLineStyle:function(t){var e=this._styleMap[t];delete this.styles[e.line]},_wrapText:function(t,e){var i,r=[];for(this.isWrapping=!0,i=0;i=r&&!g&&(s.push(o),o=[],n=u,g=!0),g||o.push(l),o=o.concat(h),f=this._measureWord([l],i,c),c++,g=!1,u>d&&(d=u);return v&&s.push(o),d>this.dynamicMinWidth&&(this.dynamicMinWidth=d-p),s},_splitTextIntoLines:function(t){for(var i=e.Text.prototype._splitTextIntoLines.call(this,t),r=this._wrapText(i.lines,this.width),n=new Array(r.length),s=0;s=h.getMinWidth()?(h.set("width",l),!0):void 0},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]}})}(),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(fabric.canvasModule),Image=require(fabric.canvasModule).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.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.width=s.width,n.height=s.height,i=i||{},i.nodeCanvas=s,i.nodeCacheCanvas=o;var a=fabric.Canvas||fabric.StaticCanvas,h=new a(n,i);return h.nodeCanvas=s,h.nodeCacheCanvas=o,h.contextContainer=s.getContext("2d"),h.contextCache=o.getContext("2d"),h.Font=Canvas.Font,h};var originaInitStatic=fabric.StaticCanvas.prototype._initStatic;fabric.StaticCanvas.prototype._initStatic=function(t,e){t=t||fabric.document.createElement("canvas"),this.nodeCanvas=new Canvas(t.width,t.height),this.nodeCacheCanvas=new Canvas(t.width,t.height),originaInitStatic.call(this,t,e),this.contextContainer=this.nodeCanvas.getContext("2d"),this.contextCache=this.nodeCacheCanvas.getContext("2d"),this.Font=Canvas.Font},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){return this.nodeCanvas.createJPEGStream(t)},fabric.StaticCanvas.prototype._initRetinaScaling=function(){if(this._isRetinaScaling())return this.lowerCanvasEl.setAttribute("width",this.width*fabric.devicePixelRatio),this.lowerCanvasEl.setAttribute("height",this.height*fabric.devicePixelRatio),this.nodeCanvas.width=this.width*fabric.devicePixelRatio,this.nodeCanvas.height=this.height*fabric.devicePixelRatio,this.contextContainer.scale(fabric.devicePixelRatio,fabric.devicePixelRatio),this},fabric.Canvas&&(fabric.Canvas.prototype._initRetinaScaling=fabric.StaticCanvas.prototype._initRetinaScaling);var origSetBackstoreDimension=fabric.StaticCanvas.prototype._setBackstoreDimension;fabric.StaticCanvas.prototype._setBackstoreDimension=function(t,e){return origSetBackstoreDimension.call(this,t,e),this.nodeCanvas[t]=e,this},fabric.Canvas&&(fabric.Canvas.prototype._setBackstoreDimension=fabric.StaticCanvas.prototype._setBackstoreDimension)}}(); \ No newline at end of file diff --git a/dist/fabric.min.js.gz b/dist/fabric.min.js.gz index c8b7e43b388b421d3be68e5563cab67b1806b1da..c5cf90370596e0c0d5bcc2fab5abd74d1c25fc6c 100644 GIT binary patch literal 76154 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
osG+X5y5k$YTmlGtVej9r6(aD%rjoS=*xO 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 E0IYfre*gdg literal 75119 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

p?+!m`M3D`8?%2ovMu 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 Jm!XO^1OWP1K@tD} diff --git a/dist/fabric.require.js b/dist/fabric.require.js index 12f674a8..fb5093f6 100644 --- a/dist/fabric.require.js +++ b/dist/fabric.require.js @@ -1,5 +1,5 @@ var fabric = fabric || { - version: "2.0.0-beta3" + version: "2.0.0-beta4" }; if (typeof exports !== "undefined") { @@ -140,7 +140,7 @@ fabric.Collection = { this._onObjectAdded(arguments[i]); } } - this.renderOnAddRemove && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, insertAt: function(object, index, nonSplicing) { @@ -151,7 +151,7 @@ fabric.Collection = { objects.splice(index, 0, object); } this._onObjectAdded && this._onObjectAdded(object); - this.renderOnAddRemove && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, remove: function() { @@ -164,7 +164,7 @@ fabric.Collection = { this._onObjectRemoved && this._onObjectRemoved(arguments[i]); } } - this.renderOnAddRemove && somethingRemoved && this.renderAll(); + this.renderOnAddRemove && somethingRemoved && this.requestRenderAll(); return this; }, forEachObject: function(callback, context) { @@ -1018,13 +1018,16 @@ fabric.CommonMethods = { var shouldUseAddListenerRemoveListener = areHostMethods(fabric.document.documentElement, "addEventListener", "removeEventListener") && areHostMethods(fabric.window, "addEventListener", "removeEventListener"), shouldUseAttachEventDetachEvent = areHostMethods(fabric.document.documentElement, "attachEvent", "detachEvent") && areHostMethods(fabric.window, "attachEvent", "detachEvent"), listeners = {}, handlers = {}, addListener, removeListener; if (shouldUseAddListenerRemoveListener) { addListener = function(element, eventName, handler, options) { - element.addEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); + element && element.addEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); }; removeListener = function(element, eventName, handler, options) { - element.removeEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); + element && element.removeEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); }; } else if (shouldUseAttachEventDetachEvent) { addListener = function(element, eventName, handler) { + if (!element) { + return; + } var uid = getUniqueId(element); setElement(uid, element); if (!listeners[uid]) { @@ -1038,6 +1041,9 @@ fabric.CommonMethods = { element.attachEvent("on" + eventName, listener.wrappedHandler); }; removeListener = function(element, eventName, handler) { + if (!element) { + return; + } var uid = getUniqueId(element), listener; if (listeners[uid] && listeners[uid][eventName]) { for (var i = 0, len = listeners[uid][eventName].length; i < len; i++) { @@ -1051,6 +1057,9 @@ fabric.CommonMethods = { }; } else { addListener = function(element, eventName, handler) { + if (!element) { + return; + } var uid = getUniqueId(element); if (!handlers[uid]) { handlers[uid] = {}; @@ -1066,6 +1075,9 @@ fabric.CommonMethods = { handlers[uid][eventName].push(handler); }; removeListener = function(element, eventName, handler) { + if (!element) { + return; + } var uid = getUniqueId(element); if (handlers[uid] && handlers[uid][eventName]) { var handlersForEvent = handlers[uid][eventName]; @@ -3178,6 +3190,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { initialize: function(el, options) { options || (options = {}); this.renderAndResetBound = this.renderAndReset.bind(this); + this.requestRenderAllBound = this.requestRenderAll.bind(this); this._initStatic(el, options); }, backgroundColor: "", @@ -3199,7 +3212,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { vptCoords: {}, skipOffscreen: true, _initStatic: function(el, options) { - var cb = fabric.StaticCanvas.prototype.renderAll.bind(this); + var cb = this.requestRenderAllBound; this._objects = []; this._createLowerCanvas(el); this._initOptions(options); @@ -3342,7 +3355,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this._setImageSmoothing(); this.calcOffset(); if (!options.cssOnly) { - this.renderAll(); + this.requestRenderAll(); } return this; }, @@ -3371,17 +3384,17 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return this.viewportTransform[0]; }, setViewportTransform: function(vpt) { - var activeGroup = this._activeGroup, object, ignoreVpt = false, skipAbsolute = true; + var activeObject = this._activeObject, object, ignoreVpt = false, skipAbsolute = true; this.viewportTransform = vpt; for (var i = 0, len = this._objects.length; i < len; i++) { object = this._objects[i]; object.group || object.setCoords(ignoreVpt, skipAbsolute); } - if (activeGroup) { - activeGroup.setCoords(ignoreVpt, skipAbsolute); + if (activeObject && activeObject.type === "activeSelection") { + activeObject.setCoords(ignoreVpt, skipAbsolute); } this.calcViewportBoundaries(); - this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, zoomToPoint: function(point, value) { @@ -3446,7 +3459,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { } this.clearContext(this.contextContainer); this.fire("canvas:cleared"); - this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, renderAll: function() { @@ -3569,7 +3582,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { }, _centerObject: function(object, center) { object.setPositionByOrigin(center, "center", "center"); - this.renderAll(); + this.requestRenderAll(); return this; }, toDatalessJSON: function(propertiesToInclude) { @@ -3609,18 +3622,18 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return object; }, __serializeBgOverlay: function(methodName, propertiesToInclude) { - var data = {}; + var data = {}, bgImage = this.backgroundImage, overlay = this.overlayImage; if (this.backgroundColor) { data.background = this.backgroundColor.toObject ? this.backgroundColor.toObject(propertiesToInclude) : this.backgroundColor; } if (this.overlayColor) { data.overlay = this.overlayColor.toObject ? this.overlayColor.toObject(propertiesToInclude) : this.overlayColor; } - if (this.backgroundImage) { - data.backgroundImage = this._toObject(this.backgroundImage, methodName, propertiesToInclude); + if (bgImage && !bgImage.excludeFromExport) { + data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude); } - if (this.overlayImage) { - data.overlayImage = this._toObject(this.overlayImage, methodName, propertiesToInclude); + if (overlay && !overlay.excludeFromExport) { + data.overlayImage = this._toObject(overlay, methodName, propertiesToInclude); } return data; }, @@ -3731,9 +3744,9 @@ fabric.ElementsParser.prototype.checkIfDone = function() { if (!object) { return this; } - var activeGroup = this._activeGroup, i, obj, objs; - if (object === activeGroup) { - objs = activeGroup._objects; + var activeSelection = this._activeObject, i, obj, objs; + if (object === activeSelection && object.type === "activeSelection") { + objs = activeSelection._objects; for (i = objs.length; i--; ) { obj = objs[i]; removeFromArray(this._objects, obj); @@ -3743,16 +3756,16 @@ fabric.ElementsParser.prototype.checkIfDone = function() { removeFromArray(this._objects, object); this._objects.unshift(object); } - this.renderAll && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, bringToFront: function(object) { if (!object) { return this; } - var activeGroup = this._activeGroup, i, obj, objs; - if (object === activeGroup) { - objs = activeGroup._objects; + var activeSelection = this._activeObject, i, obj, objs; + if (object === activeSelection && object.type === "activeSelection") { + objs = activeSelection._objects; for (i = 0; i < objs.length; i++) { obj = objs[i]; removeFromArray(this._objects, obj); @@ -3762,24 +3775,25 @@ fabric.ElementsParser.prototype.checkIfDone = function() { removeFromArray(this._objects, object); this._objects.push(object); } - this.renderAll && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, sendBackwards: function(object, intersecting) { if (!object) { return this; } - var activeGroup = this._activeGroup, i, obj, idx, newIdx, objs; - if (object === activeGroup) { - objs = activeGroup._objects; + var activeSelection = this._activeObject, i, obj, idx, newIdx, objs, objsMoved = 0; + if (object === activeSelection && object.type === "activeSelection") { + objs = activeSelection._objects; for (i = 0; i < objs.length; i++) { obj = objs[i]; idx = this._objects.indexOf(obj); - if (idx !== 0) { + if (idx > 0 + objsMoved) { newIdx = idx - 1; removeFromArray(this._objects, obj); this._objects.splice(newIdx, 0, obj); } + objsMoved++; } } else { idx = this._objects.indexOf(object); @@ -3789,7 +3803,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this._objects.splice(newIdx, 0, object); } } - this.renderAll && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, _findNewLowerIndex: function(object, idx, intersecting) { @@ -3812,17 +3826,18 @@ fabric.ElementsParser.prototype.checkIfDone = function() { if (!object) { return this; } - var activeGroup = this._activeGroup, i, obj, idx, newIdx, objs; - if (object === activeGroup) { - objs = activeGroup._objects; + var activeSelection = this._activeObject, i, obj, idx, newIdx, objs, objsMoved = 0; + if (object === activeSelection && object.type === "activeSelection") { + objs = activeSelection._objects; for (i = objs.length; i--; ) { obj = objs[i]; idx = this._objects.indexOf(obj); - if (idx !== this._objects.length - 1) { + if (idx < this._objects.length - 1 - objsMoved) { newIdx = idx + 1; removeFromArray(this._objects, obj); this._objects.splice(newIdx, 0, obj); } + objsMoved++; } } else { idx = this._objects.indexOf(object); @@ -3832,7 +3847,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this._objects.splice(newIdx, 0, object); } } - this.renderAll && this.renderAll(); + this.renderOnAddRemove && this.requestRenderAll(); return this; }, _findNewUpperIndex: function(object, idx, intersecting) { @@ -3854,7 +3869,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { moveTo: function(object, index) { removeFromArray(this._objects, object); this._objects.splice(index, 0, object); - return this.renderAll && this.renderAll(); + return this.renderOnAddRemove && this.requestRenderAll(); }, dispose: function() { this.clear(); @@ -4309,21 +4324,22 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this.calcOffset(); }, _chooseObjectsToRender: function() { - var activeGroup = this.getActiveGroup(), activeObject = this.getActiveObject(), object, objsToRender = [], activeGroupObjects = []; - if ((activeGroup || activeObject) && !this.preserveObjectStacking) { + var activeObjects = this.getActiveObjects(), object, objsToRender, activeGroupObjects; + if (activeObjects.length > 0 && !this.preserveObjectStacking) { + objsToRender = []; + activeGroupObjects = []; for (var i = 0, length = this._objects.length; i < length; i++) { object = this._objects[i]; - if ((!activeGroup || !activeGroup.contains(object)) && object !== activeObject) { + if (activeObjects.indexOf(object) === -1) { objsToRender.push(object); } else { activeGroupObjects.push(object); } } - if (activeGroup) { - activeGroup._set("_objects", activeGroupObjects); - objsToRender.push(activeGroup); + if (activeObjects.length > 1) { + this._activeObject._objects = activeGroupObjects; } - activeObject && objsToRender.push(activeObject); + objsToRender.push.apply(objsToRender, activeGroupObjects); } else { objsToRender = this._objects; } @@ -4386,7 +4402,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { }, containsPoint: function(e, target, point) { var ignoreZoom = true, pointer = point || this.getPointer(e, ignoreZoom), xy; - if (target.group && target.group === this.getActiveGroup()) { + if (target.group && target.group === this._activeObject && target.group.type === "activeSelection") { xy = this._normalizePointer(target.group, pointer); } else { xy = { @@ -4417,8 +4433,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { return isTransparent; }, _shouldClearSelection: function(e, target) { - var activeGroup = this.getActiveGroup(), activeObject = this.getActiveObject(); - return !target || target && activeGroup && !activeGroup.contains(target) && activeGroup !== target && !e[this.selectionKey] || target && !target.evented || target && !target.selectable && activeObject && activeObject !== target; + var activeObjects = this.getActiveObjects(), activeObject = this._activeObject; + return !target || target && activeObject && activeObjects.length > 1 && activeObjects.indexOf(target) === -1 && activeObject !== target && !e[this.selectionKey] || target && !target.evented || target && !target.selectable && activeObject && activeObject !== target; }, _shouldCenterTransform: function(target) { if (!target) { @@ -4752,17 +4768,17 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { if (this.skipTargetFind) { return; } - var ignoreZoom = true, pointer = this.getPointer(e, ignoreZoom), activeGroup = this.getActiveGroup(), activeObject = this.getActiveObject(), activeTarget; + var ignoreZoom = true, pointer = this.getPointer(e, ignoreZoom), activeObject = this._activeObject, aObjects = this.getActiveObjects(), activeTarget; this.targets = []; - if (activeGroup && !skipGroup && activeGroup === this._searchPossibleTargets([ activeGroup ], pointer)) { - this._fireOverOutEvents(activeGroup, e); - return activeGroup; - } - if (activeObject && activeObject._findTargetCorner(pointer)) { + if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([ activeObject ], pointer)) { this._fireOverOutEvents(activeObject, e); return activeObject; } - if (activeObject && activeObject === this._searchPossibleTargets([ activeObject ], pointer)) { + if (aObjects.length === 1 && activeObject._findTargetCorner(pointer)) { + this._fireOverOutEvents(activeObject, e); + return activeObject; + } + if (aObjects.length === 1 && activeObject === this._searchPossibleTargets([ activeObject ], pointer)) { if (!this.preserveObjectStacking) { this._fireOverOutEvents(activeObject, e); return activeObject; @@ -4924,40 +4940,22 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { getSelectionElement: function() { return this.upperCanvasEl; }, - _setActiveObject: function(object) { - var obj = this._activeObject; - if (obj) { - obj.set("active", false); - if (object !== obj && obj.onDeselect && typeof obj.onDeselect === "function") { - obj.onDeselect(); - } - } - this._activeObject = object; - object.set("active", true); - }, - setActiveObject: function(object, e) { - var currentActiveObject = this.getActiveObject(); - if (currentActiveObject && currentActiveObject !== object) { - currentActiveObject.fire("deselected", { - e: e - }); - } - this._setActiveObject(object); - this.fire("object:selected", { - target: object, - e: e - }); - object.fire("selected", { - e: e - }); - this.requestRenderAll(); - return this; - }, getActiveObject: function() { return this._activeObject; }, + getActiveObjects: function() { + var active = this._activeObject; + if (active) { + if (active.type === "activeSelection" && active._objects) { + return active._objects; + } else { + return [ active ]; + } + } + return []; + }, _onObjectRemoved: function(obj) { - if (this.getActiveObject() === obj) { + if (obj === this._activeObject) { this.fire("before:selection:cleared", { target: obj }); @@ -4972,15 +4970,47 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { } this.callSuper("_onObjectRemoved", obj); }, + setActiveObject: function(object, e) { + var currentActiveObject = this._activeObject; + if (object === currentActiveObject) { + return this; + } + if (this._setActiveObject(object)) { + currentActiveObject && currentActiveObject.fire("deselected", { + e: e + }); + this.fire("object:selected", { + target: object, + e: e + }); + object.fire("selected", { + e: e + }); + } + return this; + }, + _setActiveObject: function(object) { + var active = this._activeObject; + if (active === object) { + return false; + } + if (this._discardActiveObject()) { + this._activeObject = object; + object.set("active", true); + return true; + } + return false; + }, _discardActiveObject: function() { var obj = this._activeObject; - if (obj) { - obj.set("active", false); - if (obj.onDeselect && typeof obj.onDeselect === "function") { - obj.onDeselect(); + if (obj && obj.onDeselect && typeof obj.onDeselect === "function") { + if (obj.onDeselect()) { + return false; } + obj.set("active", false); + this._activeObject = null; } - this._activeObject = null; + return true; }, discardActiveObject: function(e) { var activeObject = this._activeObject; @@ -4989,81 +5019,19 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { target: activeObject, e: e }); - this._discardActiveObject(); - this.fire("selection:cleared", { - e: e - }); - activeObject.fire("deselected", { - e: e - }); + if (this._discardActiveObject()) { + this.fire("selection:cleared", { + e: e + }); + activeObject.fire("deselected", { + e: e + }); + } } return this; }, - _setActiveGroup: function(group) { - this._activeGroup = group; - if (group) { - group.set("active", true); - } - }, - setActiveGroup: function(group, e) { - this._setActiveGroup(group); - if (group) { - this.fire("object:selected", { - target: group, - e: e - }); - group.fire("selected", { - e: e - }); - } - return this; - }, - getActiveGroup: function() { - return this._activeGroup; - }, - _discardActiveGroup: function() { - var g = this.getActiveGroup(); - if (g) { - g.destroy(); - } - this.setActiveGroup(null); - }, - discardActiveGroup: function(e) { - var g = this.getActiveGroup(); - if (g) { - this.fire("before:selection:cleared", { - e: e, - target: g - }); - this._discardActiveGroup(); - this.fire("selection:cleared", { - e: e - }); - } - return this; - }, - deactivateAll: function() { - var allObjects = this.getObjects(), i = 0, len = allObjects.length, obj; - for (;i < len; i++) { - obj = allObjects[i]; - obj && obj.set("active", false); - } - this._discardActiveGroup(); - this._discardActiveObject(); - return this; - }, - deactivateAllWithDispatch: function(e) { - var allObjects = this.getObjects(), i = 0, len = allObjects.length, obj; - for (;i < len; i++) { - obj = allObjects[i]; - obj && obj.set("active", false); - } - this.discardActiveGroup(e); - this.discardActiveObject(e); - return this; - }, dispose: function() { - this.callSuper("dispose"); + fabric.StaticCanvas.prototype.dispose.call(this); var wrapper = this.wrapperEl; this.removeListeners(); wrapper.removeChild(this.upperCanvasEl); @@ -5076,27 +5044,14 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { return this; }, clear: function() { - this.discardActiveGroup(); this.discardActiveObject(); this.clearContext(this.contextTop); return this.callSuper("clear"); }, drawControls: function(ctx) { - var activeGroup = this.getActiveGroup(); - if (activeGroup) { - activeGroup._renderControls(ctx); - } else { - this._drawObjectsControls(ctx); - } - }, - _drawObjectsControls: function(ctx) { - var object; - for (var i = 0, len = this._objects.length; i < len; ++i) { - object = this._objects[i]; - if (!object || !object.active) { - continue; - } - object._renderControls(ctx); + var activeObject = this._activeObject; + if (activeObject) { + activeObject._renderControls(ctx); } }, _toObject: function(instance, methodName, propertiesToInclude) { @@ -5105,13 +5060,13 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { return object; }, _realizeGroupTransformOnObject: function(instance) { - var layoutProps = [ "angle", "flipX", "flipY", "height", "left", "scaleX", "scaleY", "top", "width" ]; - if (instance.group && instance.group === this.getActiveGroup()) { + if (instance.group && instance.group.type === "activeSelection" && this._activeObject === instance.group) { + var layoutProps = [ "angle", "flipX", "flipY", "left", "scaleX", "scaleY", "skewX", "skewY", "top" ]; var originalValues = {}; layoutProps.forEach(function(prop) { originalValues[prop] = instance[prop]; }); - this.getActiveGroup().realizeTransform(instance); + this._activeObject.realizeTransform(instance); return originalValues; } else { return null; @@ -5123,8 +5078,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { } }, _setSVGObject: function(markup, instance, reviver) { - var originalProperties; - originalProperties = this._realizeGroupTransformOnObject(instance); + var originalProperties = this._realizeGroupTransformOnObject(instance); this.callSuper("_setSVGObject", markup, instance, reviver); this._unwindGroupTransformOnObject(instance, originalProperties); } @@ -5317,7 +5271,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this.calcOffset(); }, _shouldRender: function(target, pointer) { - var activeObject = this.getActiveGroup() || this.getActiveObject(); + var activeObject = this._activeObject; if (activeObject && activeObject.isEditing && target === activeObject) { return false; } @@ -5455,10 +5409,10 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this._previousPointer = pointer; var shouldRender = this._shouldRender(target, pointer), shouldGroup = this._shouldGroup(e, target); if (this._shouldClearSelection(e, target)) { - this.deactivateAllWithDispatch(e); + this.discardActiveObject(e); } else if (shouldGroup) { this._handleGrouping(e, target); - target = this.getActiveGroup(); + target = this._activeObject; } if (this.selection && (!target || !target.selectable && !target.isEditing)) { this._groupSelector = { @@ -5473,15 +5427,10 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this._beforeTransform(e, target); this._setupCurrentTransform(e, target); } - var activeObject = this.getActiveObject(); - if (target !== this.getActiveGroup() && target !== activeObject) { - this.deactivateAll(); - if (target.selectable) { - activeObject && activeObject.fire("deselected", { - e: e - }); - this.setActiveObject(target, e); - } + if (target.selectable) { + this.setActiveObject(target, e); + } else { + this.discardActiveObject(); } } this._handleEvent(e, "down", target ? target : null); @@ -5610,7 +5559,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this.setCursor(this.defaultCursor); return false; } - var hoverCursor = target.hoverCursor || this.hoverCursor, activeGroup = this.getActiveGroup(), corner = target._findTargetCorner && (!activeGroup || !activeGroup.contains(target)) && target._findTargetCorner(this.getPointer(e, true)); + var hoverCursor = target.hoverCursor || this.hoverCursor, activeSelection = this._activeObject && this._activeObject.type === "activeSelection" ? this._activeObject : null, corner = (!activeSelection || !activeSelection.contains(target)) && target._findTargetCorner(this.getPointer(e, true)); if (!corner) { this.setCursor(hoverCursor); } else { @@ -5658,59 +5607,54 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { var min = Math.min, max = Math.max; fabric.util.object.extend(fabric.Canvas.prototype, { _shouldGroup: function(e, target) { - var activeObject = this.getActiveObject(); - return e[this.selectionKey] && target && target.selectable && (this.getActiveGroup() || activeObject && activeObject !== target) && this.selection; + var activeObject = this._activeObject; + return e[this.selectionKey] && target && target.selectable && this.selection && (activeObject !== target || activeObject.type === "activeSelection"); }, _handleGrouping: function(e, target) { - var activeGroup = this.getActiveGroup(); - if (target === activeGroup) { + var activeObject = this._activeObject; + if (activeObject.__corner !== 0) { + return; + } + if (target === activeObject) { target = this.findTarget(e, true); if (!target) { return; } } - if (activeGroup) { - this._updateActiveGroup(target, e); + if (activeObject && activeObject.type === "activeSelection") { + this._updateActiveSelection(target, e); } else { - this._createActiveGroup(target, e); + this._createActiveSelection(target, e); } }, - _updateActiveGroup: function(target, e) { - var activeGroup = this.getActiveGroup(); - if (activeGroup.contains(target)) { - activeGroup.removeWithUpdate(target); - target.set("active", false); - if (activeGroup.size() === 1) { - this.discardActiveGroup(e); - this.setActiveObject(activeGroup.item(0), e); + _updateActiveSelection: function(target, e) { + var activeSelection = this._activeObject; + if (activeSelection.contains(target)) { + activeSelection.removeWithUpdate(target); + if (activeSelection.size() === 1) { + this.setActiveObject(activeSelection.item(0), e); return; } } else { - activeGroup.addWithUpdate(target); + activeSelection.addWithUpdate(target); } this.fire("selection:created", { - target: activeGroup, + target: activeSelection, e: e }); - activeGroup.set("active", true); }, - _createActiveGroup: function(target, e) { - if (this._activeObject && target !== this._activeObject) { - var group = this._createGroup(target); - group.addWithUpdate(); - this.setActiveGroup(group, e); - this._activeObject = null; - this.fire("selection:created", { - target: group, - e: e - }); - } - target.set("active", true); + _createActiveSelection: function(target, e) { + var group = this._createGroup(target); + this.setActiveObject(group, e); + this.fire("selection:created", { + target: group, + e: e + }); }, _createGroup: function(target) { var objects = this.getObjects(), isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target), groupObjects = isActiveLower ? [ this._activeObject, target ] : [ target, this._activeObject ]; this._activeObject.isEditing && this._activeObject.exitEditing(); - return new fabric.Group(groupObjects, { + return new fabric.ActiveSelection(groupObjects, { canvas: this }); }, @@ -5719,11 +5663,10 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { if (group.length === 1) { this.setActiveObject(group[0], e); } else if (group.length > 1) { - group = new fabric.Group(group.reverse(), { + group = new fabric.ActiveSelection(group.reverse(), { canvas: this }); - group.addWithUpdate(); - this.setActiveGroup(group, e); + this.setActiveObject(group, e); this.fire("selection:created", { target: group, e: e @@ -5739,7 +5682,6 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { continue; } if (currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2) || currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2) || currentObject.containsPoint(selectionX1Y1) || currentObject.containsPoint(selectionX2Y2)) { - currentObject.set("active", true); group.push(currentObject); if (isClick) { break; @@ -5752,12 +5694,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { if (this.selection && this._groupSelector) { this._groupSelectedObjects(e); } - var activeGroup = this.getActiveGroup(); - if (activeGroup) { - activeGroup.setObjectsCoords().setCoords(); - activeGroup.isMoving = false; - this.setCursor(this.defaultCursor); - } + this.setCursor(this.defaultCursor); this._groupSelector = null; this._currentTransform = null; } @@ -6354,7 +6291,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { if (!this.group) { ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; } - if (this.group && this.group === this.canvas.getActiveGroup()) { + if (styleOverride.forActiveSelection) { ctx.rotate(degreesToRadians(options.angle)); drawBorders && this.drawBordersInGroup(ctx, options, styleOverride); } else { @@ -6928,15 +6865,30 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return fabric.iMatrix.concat(); }, calcTransformMatrix: function(skipGroup) { - var center = this.getCenterPoint(), translateMatrix = [ 1, 0, 0, 1, center.x, center.y ], rotateMatrix = this._calcRotateMatrix(), dimensionMatrix = this._calcDimensionsTransformMatrix(this.skewX, this.skewY, true), matrix = this.group && !skipGroup ? this.group.calcTransformMatrix() : fabric.iMatrix.concat(); - matrix = multiplyMatrices(matrix, translateMatrix); - matrix = multiplyMatrices(matrix, rotateMatrix); + var center = this.getCenterPoint(), translateMatrix = [ 1, 0, 0, 1, center.x, center.y ], rotateMatrix, dimensionMatrix = this._calcDimensionsTransformMatrix(this.skewX, this.skewY, true), matrix; + if (this.group && !skipGroup) { + matrix = multiplyMatrices(this.group.calcTransformMatrix(), translateMatrix); + } else { + matrix = translateMatrix; + } + if (this.angle) { + rotateMatrix = this._calcRotateMatrix(); + matrix = multiplyMatrices(matrix, rotateMatrix); + } matrix = multiplyMatrices(matrix, dimensionMatrix); return matrix; }, _calcDimensionsTransformMatrix: function(skewX, skewY, flipping) { - var skewMatrixX = [ 1, 0, Math.tan(degreesToRadians(skewX)), 1 ], skewMatrixY = [ 1, Math.tan(degreesToRadians(skewY)), 0, 1 ], scaleX = this.scaleX * (flipping && this.flipX ? -1 : 1), scaleY = this.scaleY * (flipping && this.flipY ? -1 : 1), scaleMatrix = [ scaleX, 0, 0, scaleY ], m = multiplyMatrices(scaleMatrix, skewMatrixX, true); - return multiplyMatrices(m, skewMatrixY, true); + var skewMatrix, scaleX = this.scaleX * (flipping && this.flipX ? -1 : 1), scaleY = this.scaleY * (flipping && this.flipY ? -1 : 1), scaleMatrix = [ scaleX, 0, 0, scaleY, 0, 0 ]; + if (skewX) { + skewMatrix = [ 1, 0, Math.tan(degreesToRadians(skewX)), 1 ]; + scaleMatrix = multiplyMatrices(scaleMatrix, skewMatrix, true); + } + if (skewY) { + skewMatrix = [ 1, Math.tan(degreesToRadians(skewY)), 0, 1 ]; + scaleMatrix = multiplyMatrices(scaleMatrix, skewMatrix, true); + } + return scaleMatrix; }, _getNonTransformedDimensions: function() { var strokeWidth = this.strokeWidth, w = this.width + strokeWidth, h = this.height + strokeWidth; @@ -7161,7 +7113,7 @@ fabric.util.object.extend(fabric.Object.prototype, { fabric.util.object.extend(fabric.Object.prototype, { _controlsVisibility: null, _findTargetCorner: function(pointer) { - if (!this.hasControls || !this.active) { + if (!this.hasControls || !this.active || this.group) { return false; } var ex = pointer.x, ey = pointer.y, xPoints, lines; @@ -7214,7 +7166,7 @@ fabric.util.object.extend(fabric.Object.prototype, { } }, drawSelectionBackground: function(ctx) { - if (!this.selectionBackgroundColor || this.group || !this.active || this.canvas && !this.canvas.interactive) { + if (!this.selectionBackgroundColor || !this.active || this.canvas && !this.canvas.interactive) { return this; } ctx.save(); @@ -8287,7 +8239,7 @@ fabric.util.object.extend(fabric.Object.prototype, { return "#"; }, toObject: function(propertiesToInclude) { - var o = extend(this.callSuper("toObject", [ "sourcePath", "pathOffset" ].concat(propertiesToInclude)), { + var o = extend(this.callSuper("toObject", propertiesToInclude), { path: this.path.map(function(item) { return item.slice(); }), @@ -8297,11 +8249,10 @@ fabric.util.object.extend(fabric.Object.prototype, { return o; }, toDatalessObject: function(propertiesToInclude) { - var o = this.toObject(propertiesToInclude); - if (this.sourcePath) { - o.path = this.sourcePath; + var o = this.toObject([ "sourcePath" ].concat(propertiesToInclude)); + if (o.sourcePath) { + delete o.path; } - delete o.sourcePath; return o; }, toSVG: function(reviver) { @@ -8534,13 +8485,11 @@ fabric.util.object.extend(fabric.Object.prototype, { } }); fabric.Path.fromObject = function(object, callback) { - if (typeof object.path === "string") { - var pathUrl = object.path; + if (typeof object.sourcePath === "string") { + var pathUrl = object.sourcePath; fabric.loadSVGFromURL(pathUrl, function(elements) { var path = elements[0]; - delete object.path; path.setOptions(object); - path.setSourcePath(pathUrl); callback && callback(path); }); } else { @@ -8582,14 +8531,7 @@ fabric.util.object.extend(fabric.Object.prototype, { if (options.originY) { this.originY = options.originY; } - if (isAlreadyGrouped) { - var object; - for (var i = this._objects.length; i--; ) { - object = this._objects[i]; - object.__origHasControls = object.hasControls; - object.hasControls = false; - } - } else { + if (!isAlreadyGrouped) { var center = options && options.centerPoint; center || this._calcBounds(); this._updateObjectsCoords(center); @@ -8605,13 +8547,12 @@ fabric.util.object.extend(fabric.Object.prototype, { } }, _updateObjectCoords: function(object, center) { - object.__origHasControls = object.hasControls; - object.hasControls = false; var objectLeft = object.left, objectTop = object.top, ignoreZoom = true, skipAbsolute = true; object.set({ left: objectLeft - center.x, top: objectTop - center.y }); + object.group = this; object.setCoords(ignoreZoom, skipAbsolute); }, toString: function() { @@ -8625,21 +8566,15 @@ fabric.util.object.extend(fabric.Object.prototype, { object.group = this; object._set("canvas", this.canvas); } - this.forEachObject(this._setObjectActive, this); this._calcBounds(); this._updateObjectsCoords(); this.setCoords(); this.dirty = true; return this; }, - _setObjectActive: function(object) { - object.set("active", true); - object.group = this; - }, removeWithUpdate: function(object) { this._restoreObjectsState(); fabric.util.resetObjectTransform(this); - this.forEachObject(this._setObjectActive, this); this.remove(object); this._calcBounds(); this._updateObjectsCoords(); @@ -8650,20 +8585,13 @@ fabric.util.object.extend(fabric.Object.prototype, { _onObjectAdded: function(object) { this.dirty = true; object.group = this; - object._set("canvas", this.canvas); }, _onObjectRemoved: function(object) { this.dirty = true; delete object.group; - object.set("active", false); }, _set: function(key, value) { var i = this._objects.length; - if (key === "canvas") { - while (i--) { - this._objects[i].set(key, value); - } - } if (this.useSetOnGroup) { while (i--) { this._objects[i].setOnGroup(key, value); @@ -8734,7 +8662,7 @@ fabric.util.object.extend(fabric.Object.prototype, { }, drawObject: function(ctx) { for (var i = 0, len = this._objects.length; i < len; i++) { - this._renderObject(this._objects[i], ctx); + this._objects[i].render(ctx); } }, isCacheDirty: function() { @@ -8755,23 +8683,6 @@ fabric.util.object.extend(fabric.Object.prototype, { } return false; }, - _renderControls: function(ctx, styleOverride, childrenOverride) { - ctx.save(); - ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; - this.callSuper("_renderControls", ctx, styleOverride); - if (this.canvas && this === this.canvas.getActiveGroup()) { - for (var i = 0, len = this._objects.length; i < len; i++) { - this._objects[i]._renderControls(ctx, childrenOverride); - } - } - ctx.restore(); - }, - _renderObject: function(object, ctx) { - var originalHasRotatingPoint = object.hasRotatingPoint; - object.hasRotatingPoint = false; - object.render(ctx); - object.hasRotatingPoint = originalHasRotatingPoint; - }, _restoreObjectsState: function() { this._objects.forEach(this._restoreObjectState, this); return this; @@ -8791,15 +8702,36 @@ fabric.util.object.extend(fabric.Object.prototype, { _restoreObjectState: function(object) { this.realizeTransform(object); object.setCoords(); - object.hasControls = object.__origHasControls; - delete object.__origHasControls; - object.set("active", false); delete object.group; return this; }, destroy: function() { return this._restoreObjectsState(); }, + toActiveSelection: function() { + if (!this.canvas) { + return; + } + var objects = this._objects, canvas = this.canvas; + this._objects = []; + var options = this.toObject(); + var activeSelection = new fabric.ActiveSelection([]); + activeSelection.set(options); + activeSelection.type = "activeSelection"; + canvas.remove(this); + objects.forEach(function(object) { + object.group = activeSelection; + object.dirty = true; + canvas.add(object); + }); + activeSelection._objects = objects; + canvas._activeObject = activeSelection; + activeSelection.setCoords(); + return activeSelection; + }, + ungroupOnCanvas: function() { + return this._restoreObjectsState(); + }, setObjectsCoords: function() { var ignoreZoom = true, skipAbsolute = true; this.forEachObject(function(object) { @@ -8854,9 +8786,120 @@ fabric.util.object.extend(fabric.Object.prototype, { } }); fabric.Group.fromObject = function(object, callback) { + fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { + var options = fabric.util.object.clone(object, true); + delete options.objects; + callback && callback(new fabric.Group(enlivenedObjects, options, true)); + }); + }; +})(typeof exports !== "undefined" ? exports : this); + +(function(global) { + "use strict"; + var fabric = global.fabric || (global.fabric = {}); + if (fabric.ActiveSelection) { + return; + } + fabric.ActiveSelection = fabric.util.createClass(fabric.Group, { + type: "activeSelection", + initialize: function(objects, options) { + options = options || {}; + this._objects = objects || []; + for (var i = this._objects.length; i--; ) { + this._objects[i].group = this; + } + if (options.originX) { + this.originX = options.originX; + } + if (options.originY) { + this.originY = options.originY; + } + this._calcBounds(); + this._updateObjectsCoords(); + fabric.Object.prototype.initialize.call(this, options); + this.setCoords(); + }, + toGroup: function() { + var objects = this._objects; + this._objects = []; + var options = this.toObject(); + var newGroup = new fabric.Group([]); + newGroup.set(options); + newGroup.type = "group"; + objects.forEach(function(object) { + object.group = newGroup; + object.canvas.remove(object); + }); + newGroup._objects = objects; + if (!this.canvas) { + return newGroup; + } + var canvas = this.canvas; + canvas._activeObject = newGroup; + canvas.add(newGroup); + newGroup.setCoords(); + return newGroup; + }, + onDeselect: function() { + this.destroy(); + return false; + }, + toString: function() { + return "#"; + }, + _set: function(key, value) { + var i = this._objects.length; + if (key === "canvas") { + while (i--) { + this._objects[i].set(key, value); + } + } + if (this.useSetOnGroup) { + while (i--) { + this._objects[i].setOnGroup(key, value); + } + } + fabric.Object.prototype._set.call(this, key, value); + }, + shouldCache: function() { + return false; + }, + willDrawShadow: function() { + if (this.shadow) { + return this.callSuper("willDrawShadow"); + } + for (var i = 0, len = this._objects.length; i < len; i++) { + if (this._objects[i].willDrawShadow()) { + return true; + } + } + return false; + }, + isOnACache: function() { + return false; + }, + _renderControls: function(ctx, styleOverride, childrenOverride) { + ctx.save(); + ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; + this.callSuper("_renderControls", ctx, styleOverride); + childrenOverride = childrenOverride || {}; + if (typeof childrenOverride.hasControls === "undefined") { + childrenOverride.hasControls = false; + } + if (typeof childrenOverride.hasRotatingPoint === "undefined") { + childrenOverride.hasRotatingPoint = false; + } + childrenOverride.forActiveSelection = true; + for (var i = 0, len = this._objects.length; i < len; i++) { + this._objects[i]._renderControls(ctx, childrenOverride); + } + ctx.restore(); + } + }); + fabric.ActiveSelection.fromObject = function(object, callback) { fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { delete object.objects; - callback && callback(new fabric.Group(enlivenedObjects, object, true)); + callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true)); }); }; })(typeof exports !== "undefined" ? exports : this); @@ -8966,7 +9009,7 @@ fabric.util.object.extend(fabric.Object.prototype, { }, toSVG: function(reviver) { var markup = this._createBaseSVGMarkup(), x = -this.width / 2, y = -this.height / 2, filtered = true; - markup.push('\n', "\n"); + markup.push('\n', "\t\n'); if (this.stroke || this.strokeDashArray) { var origFill = this.fill; this.fill = null; @@ -9227,12 +9270,12 @@ fabric.util.object.extend(fabric.Object.prototype, { fabric.util.object.extend(fabric.StaticCanvas.prototype, { straightenObject: function(object) { object.straighten(); - this.renderAll(); + this.requestRenderAll(); return this; }, fxStraightenObject: function(object) { object.fxStraighten({ - onChange: this.renderAll.bind(this) + onChange: this.requestRenderAllBound }); return this; } @@ -9270,6 +9313,42 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { this.dispose(); this.createWebGLCanvas(width, height); this.squareVertices = new Float32Array([ 0, 0, 0, 1, 1, 0, 1, 1 ]); + this.chooseFastestCopyGLTo2DMethod(width, height); + }, + chooseFastestCopyGLTo2DMethod: function(width, height) { + var canMeasurePerf = typeof window.performance !== "undefined"; + var canUseImageData; + try { + new ImageData(1, 1); + canUseImageData = true; + } catch (e) { + canUseImageData = false; + } + var canUseArrayBuffer = typeof ArrayBuffer !== "undefined"; + var canUseUint8Clamped = typeof Uint8ClampedArray !== "undefined"; + if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) { + return; + } + var targetCanvas = fabric.util.createCanvasElement(); + var imageBuffer = new ArrayBuffer(width * height * 4); + var testContext = { + imageBuffer: imageBuffer + }; + var startTime, drawImageTime, putImageDataTime; + targetCanvas.width = width; + targetCanvas.height = height; + startTime = window.performance.now(); + copyGLTo2DDrawImage.call(testContext, this.gl, targetCanvas); + drawImageTime = window.performance.now() - startTime; + startTime = window.performance.now(); + copyGLTo2DPutImageData.call(testContext, this.gl, targetCanvas); + putImageDataTime = window.performance.now() - startTime; + if (drawImageTime > putImageDataTime) { + this.imageBuffer = imageBuffer; + this.copyGLTo2D = copyGLTo2DPutImageData; + } else { + this.copyGLTo2D = copyGLTo2DDrawImage; + } }, createWebGLCanvas: function(width, height) { var canvas = fabric.util.createCanvasElement(); @@ -9307,14 +9386,15 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { webgl: true, squareVertices: this.squareVertices, programCache: this.programCache, - pass: 0 + pass: 0, + filterBackend: this }; var tempFbo = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo); filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); }); - this.copyGLTo2D(gl.canvas, targetCanvas); + this.copyGLTo2D(gl, targetCanvas); gl.bindTexture(gl.TEXTURE_2D, null); gl.deleteTexture(pipelineState.sourceTexture); gl.deleteTexture(pipelineState.targetTexture); @@ -9380,8 +9460,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { createTexture: function(gl, width, height, textureImageSource) { var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); if (textureImageSource) { @@ -9400,19 +9480,13 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return texture; } }, - copyGLTo2D: function(sourceCanvas, targetCanvas) { - var ctx = targetCanvas.getContext("2d"); - ctx.translate(0, targetCanvas.height); - ctx.scale(1, -1); - var sourceY = sourceCanvas.height - targetCanvas.height; - ctx.drawImage(sourceCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0, targetCanvas.width, targetCanvas.height); - }, evictCachesForKey: function(cacheKey) { if (this.textureCache[cacheKey]) { this.gl.deleteTexture(this.textureCache[cacheKey]); delete this.textureCache[cacheKey]; } }, + copyGLTo2D: copyGLTo2DDrawImage, captureGPUInfo: function() { if (this.gpuInfo) { return this.gpuInfo; @@ -9439,6 +9513,27 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { }; })(); +function copyGLTo2DDrawImage(gl, targetCanvas) { + var sourceCanvas = gl.canvas; + var ctx = targetCanvas.getContext("2d"); + ctx.translate(0, targetCanvas.height); + ctx.scale(1, -1); + var sourceY = sourceCanvas.height - targetCanvas.height; + ctx.drawImage(sourceCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0, targetCanvas.width, targetCanvas.height); +} + +function copyGLTo2DPutImageData(gl, targetCanvas) { + var ctx = targetCanvas.getContext("2d"); + var width = targetCanvas.width; + var height = targetCanvas.height; + var numBytes = width * height * 4; + var u8 = new Uint8Array(this.imageBuffer, 0, numBytes); + var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes); + gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, u8); + var imgData = new ImageData(u8Clamped, width); + ctx.putImageData(imgData, 0, 0); +} + (function() { "use strict"; var noop = function() {}; @@ -9461,7 +9556,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { originalEl: sourceElement, originalImageData: originalImageData, canvasEl: targetCanvas, - ctx: ctx + ctx: ctx, + filterBackend: this }; filters.forEach(function(filter) { filter.applyTo(pipelineState); @@ -10159,6 +10255,106 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; })(typeof exports !== "undefined" ? exports : this); +(function(global) { + "use strict"; + var fabric = global.fabric, filters = fabric.Image.filters, createClass = fabric.util.createClass; + filters.BlendImage = createClass(filters.BaseFilter, { + type: "BlendImage", + image: null, + mode: "multiply", + alpha: 1, + vertexSource: "attribute vec2 aPosition;\n" + "attribute vec2 aTexCoord;\n" + "varying vec2 vTexCoord;\n" + "varying vec2 vTexCoord2;\n" + "uniform mat3 uTransformMatrix;\n" + "void main() {\n" + "vTexCoord = aTexCoord;\n" + "vTexCoord2 = (uTransformMatrix * vec3(aTexCoord, 1.0)).xy;\n" + "gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n" + "}", + fragmentSource: { + multiply: "precision highp float;\n" + "uniform sampler2D uTexture;\n" + "uniform sampler2D uImage;\n" + "uniform vec4 uColor;\n" + "varying vec2 vTexCoord;\n" + "varying vec2 vTexCoord2;\n" + "void main() {\n" + "vec4 color = texture2D(uTexture, vTexCoord);\n" + "vec4 color2 = texture2D(uImage, vTexCoord2);\n" + "color.rgba *= color2.rgba;\n" + "gl_FragColor = color;\n" + "}", + mask: "precision highp float;\n" + "uniform sampler2D uTexture;\n" + "uniform sampler2D uImage;\n" + "uniform vec4 uColor;\n" + "varying vec2 vTexCoord;\n" + "varying vec2 vTexCoord2;\n" + "void main() {\n" + "vec4 color = texture2D(uTexture, vTexCoord);\n" + "vec4 color2 = texture2D(uImage, vTexCoord2);\n" + "color.a = color2.a;\n" + "gl_FragColor = color;\n" + "}" + }, + retrieveShader: function(options) { + var cacheKey = this.type + "_" + this.mode; + var shaderSource = this.fragmentSource[this.mode]; + if (!options.programCache.hasOwnProperty(cacheKey)) { + options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); + } + return options.programCache[cacheKey]; + }, + applyToWebGL: function(options) { + var gl = options.context, texture = this.createTexture(options.filterBackend, this.image); + this.bindAdditionalTexture(gl, texture, gl.TEXTURE1); + this.callSuper("applyToWebGL", options); + this.unbindAdditionalTexture(gl, gl.TEXTURE1); + }, + createTexture: function(backend, image) { + return backend.getCachedTexture(image.cacheKey, image._element); + }, + calculateMatrix: function() { + var image = this.image, width = image._element.width, height = image._element.height; + return [ 1 / image.scaleX, 0, 0, 0, 1 / image.scaleY, 0, -image.left / width, -image.top / height, 1 ]; + }, + applyTo2d: function(options) { + var imageData = options.imageData, resources = options.filterBackend.resources, data = imageData.data, iLen = data.length, width = options.imageData.width, height = options.imageData.height, tr, tg, tb, ta, r, g, b, a, canvas1, context, image = this.image, blendData; + if (!resources.blendImage) { + resources.blendImage = document.createElement("canvas"); + } + canvas1 = resources.blendImage; + if (canvas1.width !== width || canvas1.height !== height) { + canvas1.width = width; + canvas1.height = height; + } + context = canvas1.getContext("2d"); + context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top); + context.drawImage(image._element, 0, 0, width, height); + blendData = context.getImageData(0, 0, width, height).data; + for (var i = 0; i < iLen; i += 4) { + r = data[i]; + g = data[i + 1]; + b = data[i + 2]; + a = data[i + 3]; + tr = blendData[i]; + tg = blendData[i + 1]; + tb = blendData[i + 2]; + ta = blendData[i + 3]; + switch (this.mode) { + case "multiply": + data[i] = r * tr / 255; + data[i + 1] = g * tg / 255; + data[i + 2] = b * tb / 255; + data[i + 3] = a * ta / 255; + break; + + case "mask": + data[i + 3] = ta; + break; + } + } + }, + getUniformLocations: function(gl, program) { + return { + uTransformMatrix: gl.getUniformLocation(program, "uTransformMatrix"), + uImage: gl.getUniformLocation(program, "uImage") + }; + }, + sendUniformData: function(gl, uniformLocations) { + var matrix = this.calculateMatrix(); + gl.uniform1i(uniformLocations.uImage, 1); + gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix); + }, + toObject: function() { + return { + type: this.type, + image: this.image && this.image.toObject(), + mode: this.mode, + alpha: this.alpha + }; + } + }); + fabric.Image.filters.BlendImage.fromObject = function(object, callback) { + fabric.Image.fromObject(object.image, function(image) { + var options = fabric.util.object.clone(object); + options.image = image; + callback(new fabric.Image.filters.BlendImage(options)); + }); + }; +})(typeof exports !== "undefined" ? exports : this); + (function(global) { "use strict"; var fabric = global.fabric || (global.fabric = {}), pow = Math.pow, floor = Math.floor, sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin, ceil = Math.ceil, filters = fabric.Image.filters, createClass = fabric.util.createClass; @@ -10314,7 +10510,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { return destImage; }, hermiteFastResize: function(options, oW, oH, dW, dH) { - var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY, ratioWHalf = ceil(ratioW / 2), ratioHHalf = ceil(ratioH / 2), img = options.imageData, data = img.data, img2 = options.ctx.createimageData(dW, dH), data2 = img2.data; + var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY, ratioWHalf = ceil(ratioW / 2), ratioHHalf = ceil(ratioH / 2), img = options.imageData, data = img.data, img2 = options.ctx.createImageData(dW, dH), data2 = img2.data; for (var j = 0; j < dH; j++) { for (var i = 0; i < dW; i++) { var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0, gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + .5) * ratioH; @@ -10452,7 +10648,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { options.imageData = this.simpleBlur(options); }, simpleBlur: function(options) { - var resources = fabric.filterBackend.resources, canvas1, canvas2, width = options.imageData.width, height = options.imageData.height; + var resources = options.filterBackend.resources, canvas1, canvas2, width = options.imageData.width, height = options.imageData.height; if (!resources.blurLayer1) { resources.blurLayer1 = document.createElement("canvas"); resources.blurLayer2 = document.createElement("canvas"); @@ -10882,7 +11078,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { if (!fabric.charWidthsCache[fontFamily]) { fabric.charWidthsCache[fontFamily] = {}; } - var cache = fabric.charWidthsCache[fontFamily], cacheProp = decl.fontStyle.toLowerCase() + "_" + decl.fontWeight.toLowerCase(); + var cache = fabric.charWidthsCache[fontFamily], cacheProp = decl.fontStyle.toLowerCase() + "_" + (decl.fontWeight + "").toLowerCase(); if (!cache[cacheProp]) { cache[cacheProp] = {}; } @@ -12317,8 +12513,9 @@ fabric.util.object.extend(fabric.IText.prototype, { this.hiddenTextarea.setAttribute("autocomplete", "off"); this.hiddenTextarea.setAttribute("spellcheck", "false"); this.hiddenTextarea.setAttribute("data-fabric-hiddentextarea", ""); + this.hiddenTextarea.setAttribute("wrap", "off"); var style = this._calcTextareaPosition(); - this.hiddenTextarea.style.cssText = "white-space: nowrap; position: absolute; top: " + style.top + "; left: " + style.left + "; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;" + " line-height: 1px; paddingーtop: " + style.fontSize + ";"; + this.hiddenTextarea.style.cssText = "position: absolute; top: " + style.top + "; left: " + style.left + "; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;" + " line-height: 1px; paddingーtop: " + style.fontSize + ";"; 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)); @@ -12695,7 +12892,7 @@ fabric.util.object.extend(fabric.IText.prototype, { }, _wrapSVGTextAndBg: function(markup, textAndBg) { var noShadow = true, filter = this.getSvgFilter(), style = filter === "" ? "" : ' style="' + filter + '"'; - markup.push("\t\n", textAndBg.textBgRects.join(""), "\t\t\n', textAndBg.textSpans.join(""), "\t\t\n", "\t\n"); + markup.push("\t\n", textAndBg.textBgRects.join(""), '\t\t\n', textAndBg.textSpans.join(""), "\t\t\n", "\t\n"); }, _getSVGTextAndBg: function(textTopOffset, textLeftOffset) { var textSpans = [], textBgRects = [], height = textTopOffset, lineOffset; @@ -12784,6 +12981,10 @@ fabric.util.object.extend(fabric.IText.prototype, { lineTop: lineTopOffset, offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult) }; + }, + getSvgStyles: function(skipShadow) { + var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow); + return svgStyle + " white-space: pre;"; } }); })(); diff --git a/package.json b/package.json index f7292219..972ceb1e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "fabric", "description": "Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.", "homepage": "http://fabricjs.com/", - "version": "2.0.0-beta.3", + "version": "2.0.0-beta.4", "author": "Juriy Zaytsev ", "contributors": [ {