From 5605d84f3b6f9b7022ce118d0554954cf6fb41f1 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Tue, 14 Feb 2017 09:35:24 -0500 Subject: [PATCH] Version 1.7.4 (#3692) * v174 * fixed a text for browser --- CHANGELOG.md | 17 + HEADER.js | 2 +- ISSUE_TEMPLATE.md | 2 +- dist/fabric.js | 912 ++++++++++++++++++----------------- dist/fabric.min.js | 18 +- dist/fabric.min.js.gz | Bin 69315 -> 69594 bytes dist/fabric.require.js | 581 +++++++++++----------- package.json | 2 +- test/unit/object_geometry.js | 4 +- 9 files changed, 805 insertions(+), 733 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a08dae0..d448d293 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +**Version 1.7.4** + +- Fix: Moved all the touch event to passive false so that they behave as before chrome changes [#3690](https://github.com/kangax/fabric.js/pull/3690) +- Fix: force top and left in the object representation of a path to avoid reparsing on restore [#3691](https://github.com/kangax/fabric.js/pull/3691) +- Add: Enable `deselected` event for activeObject switch. Ensure deactivateAll call exitEditing [#3689](https://github.com/kangax/fabric.js/pull/3689) +- Fix: Perform subtargetCheck also if the group is an active object and on activeGroup [#3688](https://github.com/kangax/fabric.js/pull/3688) +- Fix: Made cursor operation more precise at high canvas zoom level [#3671](https://github.com/kangax/fabric.js/pull/3671) +- Add: Made getBoundingRect available to return both absolute or standard bounding rect [#3614](https://github.com/kangax/fabric.js/pull/3614) +- Add: Introduced calcViewportBoundaries() function for fabric.StaticCanvas [#3614](https://github.com/kangax/fabric.js/pull/3614) +- Add: Introduced isOnScreen() function for fabric.Object [#3614](https://github.com/kangax/fabric.js/pull/3614) +- Subclassed Polygon from polyline [#3614](https://github.com/kangax/fabric.js/pull/3614) +- Fix: Removed reference to hovered target when target gets removed [#3657](https://github.com/kangax/fabric.js/pull/3657) +- Fix: Removed hover cursor for non selectable objects [#3643](https://github.com/kangax/fabric.js/pull/3643) +- Fix: Switch to passive event for touch move [#3643](https://github.com/kangax/fabric.js/pull/3643) +- Fix: Restart rendering of cursor after entering some text [#3643](https://github.com/kangax/fabric.js/pull/3643) +- Add: fabric.Color support toHexa() method now [#3615](https://github.com/kangax/fabric.js/pull/3615) + **Version 1.7.3** - Improvement: mousewheel event is handled with target and fired also from objects. [#3612](https://github.com/kangax/fabric.js/pull/3612) diff --git a/HEADER.js b/HEADER.js index f2e5bf59..03df5911 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: "1.7.3" }; +var fabric = fabric || { version: "1.7.4" }; if (typeof exports !== 'undefined') { exports.fabric = fabric; } diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index ab31aa60..7425a26f 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -25,7 +25,7 @@ Remove the template from below and provide thoughtful commentary *and code sampl ## Version -1.7.3 +1.7.4 ## Test Case http://jsfiddle.net/fabricjs/Da7SP/ diff --git a/dist/fabric.js b/dist/fabric.js index 785ef5e2..b3f66631 100644 --- a/dist/fabric.js +++ b/dist/fabric.js @@ -1,7 +1,7 @@ /* build: `node build.js modules=ALL exclude=json,gestures minifier=uglifyjs` */ /*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: "1.7.3" }; +var fabric = fabric || { version: "1.7.4" }; if (typeof exports !== 'undefined') { exports.fabric = fabric; } @@ -62,6 +62,7 @@ fabric.SHARED_ATTRIBUTES = [ fabric.DPI = 96; fabric.reNum = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)'; fabric.fontPaths = { }; +fabric.iMatrix = [1, 0, 0, 1, 0, 0]; /** * Cache Object for widths of chars in text rendering. @@ -2048,12 +2049,13 @@ fabric.CommonMethods = { if (shouldUseAddListenerRemoveListener) { /** @ignore */ - addListener = function (element, eventName, handler) { - element.addEventListener(eventName, handler, false); + 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); }; /** @ignore */ - removeListener = function (element, eventName, handler) { - element.removeEventListener(eventName, handler, false); + removeListener = function (element, eventName, handler, options) { + element.removeEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); }; } @@ -4903,7 +4905,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { }, /** - * Returns color represenation in RGB format + * Returns color representation in RGB format * @return {String} ex: rgb(0-255,0-255,0-255) */ toRgb: function() { @@ -4912,7 +4914,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { }, /** - * Returns color represenation in RGBA format + * Returns color representation in RGBA format * @return {String} ex: rgba(0-255,0-255,0-255,0-1) */ toRgba: function() { @@ -4921,7 +4923,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { }, /** - * Returns color represenation in HSL format + * Returns color representation in HSL format * @return {String} ex: hsl(0-360,0%-100%,0%-100%) */ toHsl: function() { @@ -4932,7 +4934,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { }, /** - * Returns color represenation in HSLA format + * Returns color representation in HSLA format * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1) */ toHsla: function() { @@ -4943,7 +4945,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { }, /** - * Returns color represenation in HEX format + * Returns color representation in HEX format * @return {String} ex: FF5555 */ toHex: function() { @@ -4961,6 +4963,20 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return r.toUpperCase() + g.toUpperCase() + b.toUpperCase(); }, + /** + * Returns color representation in HEXA format + * @return {String} ex: FF5555CC + */ + toHexa: function() { + var source = this.getSource(), a; + + a = source[3] * 255; + a = a.toString(16); + a = (a.length === 1) ? ('0' + a) : a; + + return this.toHex() + a.toUpperCase(); + }, + /** * Gets value of alpha channel for this color * @return {Number} 0-1 @@ -6081,6 +6097,8 @@ fabric.ElementsParser.prototype.checkIfDone = function() { getElementOffset = fabric.util.getElementOffset, removeFromArray = fabric.util.removeFromArray, toFixed = fabric.util.toFixed, + transformPoint = fabric.util.transformPoint, + invertTransform = fabric.util.invertTransform, CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element'); @@ -6207,7 +6225,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @type Array * @default */ - viewportTransform: [1, 0, 0, 1, 0, 0], + viewportTransform: fabric.iMatrix.concat(), /** * if set to false background image is not affected by viewport transform @@ -6237,6 +6255,17 @@ fabric.ElementsParser.prototype.checkIfDone = function() { */ enableRetinaScaling: true, + /** + * Describe canvas element extension over design + * properties are tl,tr,bl,br. + * if canvas is not zoomed/panned those points are the four corner of canvas + * if canvas is viewportTransformed you those points indicate the extension + * of canvas element in plain untrasformed coordinates + * The coordinates get updated with @method calcViewportBoundaries. + * @memberOf fabric.StaticCanvas.prototype + */ + vptCoords: { }, + /** * @private * @param {HTMLElement | String} el <canvas> element to initialize instance on @@ -6717,6 +6746,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { if (activeGroup) { activeGroup.setCoords(ingoreVpt, skipAbsolute); } + this.calcViewportBoundaries(); this.renderAll(); return this; }, @@ -6731,10 +6761,10 @@ fabric.ElementsParser.prototype.checkIfDone = function() { zoomToPoint: function (point, value) { // TODO: just change the scale, preserve other transformations var before = point, vpt = this.viewportTransform.slice(0); - point = fabric.util.transformPoint(point, fabric.util.invertTransform(this.viewportTransform)); + point = transformPoint(point, invertTransform(this.viewportTransform)); vpt[0] = value; vpt[3] = value; - var after = fabric.util.transformPoint(point, vpt); + var after = transformPoint(point, vpt); vpt[4] += before.x - after.x; vpt[5] += before.y - after.y; return this.setViewportTransform(vpt); @@ -6838,8 +6868,6 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this.backgroundColor = ''; this.overlayColor = ''; if (this._hasITextHandlers) { - this.off('selection:cleared', this._canvasITextSelectionClearedHanlder); - this.off('object:selected', this._canvasITextSelectionClearedHanlder); this.off('mouse:up', this._mouseUpITextHandler); this._iTextInstances = null; this._hasITextHandlers = false; @@ -6851,7 +6879,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { }, /** - * Renders both the canvas. + * Renders the canvas * @return {fabric.Canvas} instance * @chainable */ @@ -6861,6 +6889,24 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return this; }, + /** + * Calculate the position of the 4 corner of canvas with current viewportTransform. + * helps to determinate when an object is in the current rendering viewport using + * object absolute coordinates ( aCoords ) + * @return {Object} points.tl + * @chainable + */ + calcViewportBoundaries: function() { + var points = { }, width = this.getWidth(), height = this.getHeight(), + iVpt = invertTransform(this.viewportTransform); + points.tl = transformPoint({ x: 0, y: 0 }, iVpt); + points.br = transformPoint({ x: width, y: height }, iVpt); + points.tr = new fabric.Point(points.br.x, points.tl.y); + points.bl = new fabric.Point(points.tl.x, points.br.y); + this.vptCoords = points; + return points; + }, + /** * Renders background, objects, overlay and controls. * @param {CanvasRenderingContext2D} ctx @@ -6869,6 +6915,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { * @chainable */ renderCanvas: function(ctx, objects) { + this.calcViewportBoundaries(); this.clearContext(ctx); this.fire('before:render'); if (this.clipTo) { @@ -7042,8 +7089,8 @@ fabric.ElementsParser.prototype.checkIfDone = function() { */ getVpCenter: function() { var center = this.getCenter(), - iVpt = fabric.util.invertTransform(this.viewportTransform); - return fabric.util.transformPoint({ x: center.left, y: center.top }, iVpt); + iVpt = invertTransform(this.viewportTransform); + return transformPoint({ x: center.left, y: center.top }, iVpt); }, /** @@ -9345,7 +9392,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @private */ _setLocalMouse: function(localMouse, t) { - var target = t.target; + var target = t.target, zoom = this.getZoom(), + padding = target.padding / zoom; if (t.originX === 'right') { localMouse.x *= -1; @@ -9368,24 +9416,24 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab } // adjust the mouse coordinates when dealing with padding - if (abs(localMouse.x) > target.padding) { + if (abs(localMouse.x) > padding) { if (localMouse.x < 0) { - localMouse.x += target.padding; + localMouse.x += padding; } else { - localMouse.x -= target.padding; + localMouse.x -= padding; } } else { // mouse is within the padding, set to 0 localMouse.x = 0; } - if (abs(localMouse.y) > target.padding) { + if (abs(localMouse.y) > padding) { if (localMouse.y < 0) { - localMouse.y += target.padding; + localMouse.y += padding; } else { - localMouse.y -= target.padding; + localMouse.y -= padding; } } else { @@ -9520,6 +9568,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab /** * Method that determines what object we are clicking on + * the skipGroup parameter is for internal use, is needed for shift+click action * @param {Event} e mouse event * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through */ @@ -9536,7 +9585,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab // first check current group (if one exists) // active group does not check sub targets like normal groups. // if active group just exits. - if (activeGroup && !skipGroup && this._checkTarget(pointer, activeGroup)) { + if (activeGroup && !skipGroup && activeGroup === this._searchPossibleTargets([activeGroup], pointer)) { this._fireOverOutEvents(activeGroup, e); return activeGroup; } @@ -9545,7 +9594,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this._fireOverOutEvents(activeObject, e); return activeObject; } - if (activeObject && this._checkTarget(pointer, activeObject)) { + if (activeObject && activeObject === this._searchPossibleTargets([activeObject], pointer)) { if (!this.preserveObjectStacking) { this._fireOverOutEvents(activeObject, e); return activeObject; @@ -9643,6 +9692,16 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab /** * Returns pointer coordinates relative to canvas. + * Can return coordinates with or without viewportTransform. + * ignoreZoom false gives back coordinates that represent + * the point clicked on canvas element. + * ignoreZoom true gives back coordinates after being processed + * by the viewportTransform ( sort of coordinates of what is displayed + * on the canvas where you are clicking. + * To interact with your shapes top and left you want to use ignoreZoom true + * most of the time, while ignoreZoom false will give you coordinates + * compatible with the object.oCoords system. + * of the time. * @param {Event} e * @param {Boolean} ignoreZoom * @return {Object} object with "x" and "y" number values @@ -9746,7 +9805,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab width: width + 'px', height: height + 'px', left: 0, - top: 0 + top: 0, + 'touch-action': 'none' }); element.width = width; element.height = height; @@ -9784,8 +9844,12 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Object} object */ _setActiveObject: function(object) { - if (this._activeObject) { - this._activeObject.set('active', false); + 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); @@ -9799,6 +9863,10 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @chainable */ setActiveObject: function (object, e) { + var currentActiveObject = this.getActiveObject(); + if (currentActiveObject && currentActiveObject !== object) { + currentActiveObject.fire('deselected', { e: e }); + } this._setActiveObject(object); this.renderAll(); this.fire('object:selected', { target: object, e: e }); @@ -9826,6 +9894,9 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab this.fire('selection:cleared', { target: obj }); obj.fire('deselected'); } + if (this._hoveredTarget === obj) { + this._hoveredTarget = null; + } this.callSuper('_onObjectRemoved', obj); }, @@ -9833,24 +9904,33 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @private */ _discardActiveObject: function() { - if (this._activeObject) { - this._activeObject.set('active', false); + var obj = this._activeObject; + if (obj) { + obj.set('active', false); + if (obj.onDeselect && typeof obj.onDeselect === 'function') { + obj.onDeselect(); + } } this._activeObject = null; }, /** - * Discards currently active object and fire events + * Discards currently active object 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. * @param {event} e * @return {fabric.Canvas} thisArg * @chainable */ discardActiveObject: function (e) { var activeObject = this._activeObject; - this.fire('before:selection:cleared', { target: activeObject, e: e }); - this._discardActiveObject(); - this.fire('selection:cleared', { e: e }); - activeObject && activeObject.fire('deselected', { e: e }); + if (activeObject) { + this.fire('before:selection:cleared', { target: activeObject, e: e }); + this._discardActiveObject(); + this.fire('selection:cleared', { e: e }); + activeObject.fire('deselected', { e: e }); + } return this; }, @@ -9866,7 +9946,10 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab }, /** - * Sets active group to a specified one + * 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 @@ -9901,15 +9984,20 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab }, /** - * Discards currently active group and fire events + * 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(); - this.fire('before:selection:cleared', { e: e, target: g }); - this._discardActiveGroup(); - this.fire('selection:cleared', { e: e }); + if (g) { + this.fire('before:selection:cleared', { e: e, target: g }); + this._discardActiveGroup(); + this.fire('selection:cleared', { e: e }); + } return this; }, @@ -9933,21 +10021,17 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab }, /** - * Deactivates all objects and dispatches appropriate events + * 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 activeGroup = this.getActiveGroup(), - activeObject = this.getActiveObject(); - if (activeObject || activeGroup) { - this.fire('before:selection:cleared', { target: activeObject || activeGroup, e: e }); - } + this.discardActiveGroup(e); + this.discardActiveObject(e); this.deactivateAll(); - if (activeObject || activeGroup) { - this.fire('selection:cleared', { e: e, target: activeObject }); - activeObject && activeObject.fire('deselected'); - } return this; }, @@ -10146,8 +10230,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab addListener(this.upperCanvasEl, 'contextmenu', this._onContextMenu); // touch events - addListener(this.upperCanvasEl, 'touchstart', this._onMouseDown); - addListener(this.upperCanvasEl, 'touchmove', this._onMouseMove); + addListener(this.upperCanvasEl, 'touchstart', this._onMouseDown, { passive: false }); + addListener(this.upperCanvasEl, 'touchmove', this._onMouseMove, { passive: false }); if (typeof eventjs !== 'undefined' && 'add' in eventjs) { eventjs.add(this.upperCanvasEl, 'gesture', this._onGesture); @@ -10296,8 +10380,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab _onMouseDown: function (e) { this.__onMouseDown(e); - addListener(fabric.document, 'touchend', this._onMouseUp); - addListener(fabric.document, 'touchmove', this._onMouseMove); + addListener(fabric.document, 'touchend', this._onMouseUp, { passive: false }); + addListener(fabric.document, 'touchmove', this._onMouseMove, { passive: false }); removeListener(this.upperCanvasEl, 'mousemove', this._onMouseMove); removeListener(this.upperCanvasEl, 'touchmove', this._onMouseMove); @@ -10326,7 +10410,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab removeListener(fabric.document, 'touchmove', this._onMouseMove); addListener(this.upperCanvasEl, 'mousemove', this._onMouseMove); - addListener(this.upperCanvasEl, 'touchmove', this._onMouseMove); + addListener(this.upperCanvasEl, 'touchmove', this._onMouseMove, { passive: false }); if (e.type === 'touchend') { // Wait 400ms before rebinding mousedown to prevent double triggers @@ -10841,29 +10925,23 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fab * @param {Object} target Object that the mouse is hovering, if so. */ _setCursorFromEvent: function (e, target) { - if (!target) { + if (!target || !target.selectable) { this.setCursor(this.defaultCursor); return false; } - var hoverCursor = target.hoverCursor || this.hoverCursor; - if (!target.selectable) { - //let's skip _findTargetCorner if object is not selectable + var hoverCursor = target.hoverCursor || this.hoverCursor, + activeGroup = this.getActiveGroup(), + // only show proper corner when group selection is not active + corner = target._findTargetCorner + && (!activeGroup || !activeGroup.contains(target)) + && target._findTargetCorner(this.getPointer(e, true)); + + if (!corner) { this.setCursor(hoverCursor); } else { - var activeGroup = this.getActiveGroup(), - // only show proper corner when group selection is not active - corner = target._findTargetCorner - && (!activeGroup || !activeGroup.contains(target)) - && target._findTargetCorner(this.getPointer(e, true)); - - if (!corner) { - this.setCursor(hoverCursor); - } - else { - this._setCornerCursor(corner, target, e); - } + this._setCornerCursor(corner, target, e); } //actually unclear why it should return something //is never evaluated @@ -12575,7 +12653,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati if (this.canvas && this.canvas.viewportTransform) { return this.canvas.viewportTransform; } - return [1, 0, 0, 1, 0, 0]; + return fabric.iMatrix.concat(); }, /** @@ -12653,8 +12731,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati else { if (this.dirty || (this.statefullCache && this.hasStateChanged('cacheProperties'))) { if (!skipCanvas) { - var dim = this._getNonTransformedDimensions(); - this._cacheContext.clearRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y); + var width = this.cacheWidth / this.zoomX; + var height = this.cacheHeight / this.zoomY; + this._cacheContext.clearRect(-width / 2, -height / 2, width, height); } return true; } @@ -12960,10 +13039,10 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * Returns complexity of an instance - * @return {Number} complexity of this instance + * @return {Number} complexity of this instance (is 1 unless subclassed) */ complexity: function() { - return 0; + return 1; }, /** @@ -13548,12 +13627,12 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati (function() { - function getCoords(oCoords) { + function getCoords(coords) { return [ - new fabric.Point(oCoords.tl.x, oCoords.tl.y), - new fabric.Point(oCoords.tr.x, oCoords.tr.y), - new fabric.Point(oCoords.br.x, oCoords.br.y), - new fabric.Point(oCoords.bl.x, oCoords.bl.y) + new fabric.Point(coords.tl.x, coords.tl.y), + new fabric.Point(coords.tr.x, coords.tr.y), + new fabric.Point(coords.br.x, coords.br.y), + new fabric.Point(coords.bl.x, coords.bl.y) ]; } @@ -13563,22 +13642,56 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { /** - * Object containing coordinates of object's controls - * @type Object - * @default + * Describe object's corner position in canvas element coordinates. + * properties are tl,mt,tr,ml,mr,bl,mb,br,mtr for the main controls. + * each property is an object with x, y and corner. + * The `corner` property contains in a similar manner the 4 points of the + * interactive area of the corner. + * The coordinates depends from this properties: width, height, scaleX, scaleY + * skewX, skewY, angle, strokeWidth, viewportTransform, top, left, padding. + * The coordinates get updated with @method setCoords. + * You can calculate them without updating with @method calcCoords; + * @memberOf fabric.Object.prototype */ oCoords: null, + /** + * Describe object's corner position in canvas object absolute coordinates + * properties are tl,tr,bl,br and describe the four main corner. + * each property is an object with x, y, instance of Fabric.Point. + * The coordinates depends from this properties: width, height, scaleX, scaleY + * skewX, skewY, angle, strokeWidth, top, left. + * Those coordinates are usefull to understand where an object is. They get updated + * with oCoords but they do not need to be updated when zoom or panning change. + * The coordinates get updated with @method setCoords. + * You can calculate them without updating with @method calcCoords(true); + * @memberOf fabric.Object.prototype + */ + aCoords: null, + + /** + * return correct set of coordinates for intersection + */ + getCoords: function(absolute, calculate) { + if (!this.oCoords) { + this.setCoords(); + } + var coords = absolute ? this.aCoords : this.oCoords; + return getCoords(calculate ? this.calcCoords(absolute) : coords); + }, + /** * Checks if object intersects with an area formed by 2 points * @param {Object} pointTL top-left point of area * @param {Object} pointBR bottom-right point of area + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords * @return {Boolean} true if object intersects with an area formed by 2 points */ - intersectsWithRect: function(pointTL, pointBR) { - var oCoords = getCoords(this.oCoords), + intersectsWithRect: function(pointTL, pointBR, absolute, calculate) { + var coords = this.getCoords(absolute, calculate), intersection = fabric.Intersection.intersectPolygonRectangle( - oCoords, + coords, pointTL, pointBR ); @@ -13588,29 +13701,35 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * Checks if object intersects with another object * @param {Object} other Object to test + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords * @return {Boolean} true if object intersects with another object */ - intersectsWithObject: function(other) { + intersectsWithObject: function(other, absolute, calculate) { var intersection = fabric.Intersection.intersectPolygonPolygon( - getCoords(this.oCoords), - getCoords(other.oCoords) + this.getCoords(absolute, calculate), + other.getCoords(absolute, calculate) ); return intersection.status === 'Intersection' - || other.isContainedWithinObject(this) - || this.isContainedWithinObject(other); + || other.isContainedWithinObject(this, absolute, calculate) + || this.isContainedWithinObject(other, absolute, calculate); }, /** * Checks if object is fully contained within area of another object * @param {Object} other Object to test + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords * @return {Boolean} true if object is fully contained within area of another object */ - isContainedWithinObject: function(other) { - var points = getCoords(this.oCoords), - i = 0; + isContainedWithinObject: function(other, absolute, calculate) { + var points = this.getCoords(absolute, calculate), + i = 0, lines = other._getImageLines( + calculate ? other.calcCoords(absolute) : absolute ? other.aCoords : other.oCoords + ); for (; i < 4; i++) { - if (!other.containsPoint(points[i])) { + if (!other.containsPoint(points[i], lines)) { return false; } } @@ -13621,10 +13740,12 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati * Checks if object is fully contained within area formed by 2 points * @param {Object} pointTL top-left point of area * @param {Object} pointBR bottom-right point of area + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords * @return {Boolean} true if object is fully contained within area formed by 2 points */ - isContainedWithinRect: function(pointTL, pointBR) { - var boundingRect = this.getBoundingRect(); + isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) { + var boundingRect = this.getBoundingRect(absolute, calculate); return ( boundingRect.left >= pointTL.x && @@ -13637,19 +13758,42 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * Checks if point is inside the object * @param {fabric.Point} point Point to check against + * @param {Object} [lines] object returned from @method _getImageLines + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords * @return {Boolean} true if point is inside the object */ - containsPoint: function(point) { - if (!this.oCoords) { - this.setCoords(); - } - var lines = this._getImageLines(this.oCoords), + containsPoint: function(point, lines, absolute, calculate) { + var lines = lines || this._getImageLines( + calculate ? this.calcCoords(absolute) : absolute ? this.aCoords : this.oCoords + ), xPoints = this._findCrossPoints(point, lines); // if xPoints is odd then point is inside the object return (xPoints !== 0 && xPoints % 2 === 1); }, + /** + * Checks if object is contained within the canvas with current viewportTransform + * the check is done stopping at first point that appear on screen + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords + * @return {Boolean} true if object is fully contained within canvas + */ + isOnScreen: function(calculate) { + if (!this.canvas) { + return false; + } + var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; + var points = this.getCoords(true, calculate), point; + for (var i = 0; i < 4; i++) { + point = points[i]; + if (point.x <= pointBR.x && point.x >= pointTL.x && point.y <= pointBR.y && point.y >= pointTL.y) { + return true; + } + } + return false; + }, + /** * Method that returns an object with the object edges in it, given the coordinates of the corners * @private @@ -13681,16 +13825,16 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati * and the horizontal line determined by a point on canvas * @private * @param {fabric.Point} point Point to check - * @param {Object} oCoords Coordinates of the object being evaluated + * @param {Object} lines Coordinates of the object being evaluated */ // remove yi, not used but left code here just in case. - _findCrossPoints: function(point, oCoords) { + _findCrossPoints: function(point, lines) { var b1, b2, a1, a2, xi, // yi, xcount = 0, iLine; - for (var lineKey in oCoords) { - iLine = oCoords[lineKey]; + for (var lineKey in lines) { + iLine = lines[lineKey]; // optimisation 1: line below point. no cross if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) { continue; @@ -13747,17 +13891,13 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * Returns coordinates of object's bounding rectangle (left, top, width, height) * the box is intented as aligned to axis of canvas. - * @param {Boolean} ignoreVpt bounding box will not be affected by viewportTransform + * @param {Boolean} [absolute] use coordinates without viewportTransform + * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords * @return {Object} Object with left, top, width, height properties */ - getBoundingRect: function(ignoreVpt) { - var coords = this.calcCoords(ignoreVpt); - return fabric.util.makeBoundingBoxFromPoints([ - coords.tl, - coords.tr, - coords.br, - coords.bl - ]); + getBoundingRect: function(absolute, calculate) { + var coords = this.getCoords(absolute, calculate); + return fabric.util.makeBoundingBoxFromPoints(coords); }, /** @@ -13844,10 +13984,10 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati * @return {Object} Object with tl, tr, br, bl .... * @chainable */ - calcCoords: function(ignoreVpt) { + calcCoords: function(absolute) { var theta = degreesToRadians(this.angle), vpt = this.getViewportTransform(), - dim = ignoreVpt ? this._getTransformedDimensions() : this._calculateCurrentDimensions(), + dim = absolute ? this._getTransformedDimensions() : this._calculateCurrentDimensions(), currentWidth = dim.x, currentHeight = dim.y, sinTh = Math.sin(theta), cosTh = Math.cos(theta), @@ -13857,12 +13997,12 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati offsetY = Math.sin(_angle + theta) * _hypotenuse, center = this.getCenterPoint(), // offset added for rotate and scale actions - coords = ignoreVpt ? center : fabric.util.transformPoint(center, vpt), + coords = absolute ? center : fabric.util.transformPoint(center, vpt), tl = new fabric.Point(coords.x - offsetX, coords.y - offsetY), tr = new fabric.Point(tl.x + (currentWidth * cosTh), tl.y + (currentWidth * sinTh)), bl = new fabric.Point(tl.x - (currentHeight * sinTh), tl.y + (currentHeight * cosTh)), br = new fabric.Point(coords.x + offsetX, coords.y + offsetY); - if (!ignoreVpt) { + if (!absolute) { var ml = new fabric.Point((tl.x + bl.x) / 2, (tl.y + bl.y) / 2), mt = new fabric.Point((tr.x + tl.x) / 2, (tr.y + tl.y) / 2), mr = new fabric.Point((br.x + tr.x) / 2, (br.y + tr.y) / 2), @@ -13889,7 +14029,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati // corners tl: tl, tr: tr, br: br, bl: bl, }; - if (!ignoreVpt) { + if (!absolute) { // middle coords.ml = ml; coords.mt = mt; @@ -13904,22 +14044,24 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati /** * Sets corner position coordinates based on current angle, width and height * See https://github.com/kangax/fabric.js/wiki/When-to-call-setCoords + * @param {Boolean} [ignoreZoom] set oCoords with or without the viewport transform. + * @param {Boolean} [skipAbsolute] skip calculation of aCoords, usefull in setViewportTransform * @return {fabric.Object} thisArg * @chainable */ setCoords: function(ignoreZoom, skipAbsolute) { this.oCoords = this.calcCoords(ignoreZoom); - if (!skipAbsolute && !ignoreZoom) { - this.absoluteCoords = this.calcCoords(true); + if (!skipAbsolute) { + this.aCoords = this.calcCoords(true); } // set coordinates of the draggable boxes in the corners used to scale/rotate the image - ignoreZoom || this._setCornerCoords && this._setCornerCoords(); + ignoreZoom || (this._setCornerCoords && this._setCornerCoords()); return this; }, - /* + /** * calculate rotation matrix of an object * @return {Array} rotation matrix for the object */ @@ -13928,20 +14070,21 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati var theta = degreesToRadians(this.angle), cos = Math.cos(theta), sin = Math.sin(theta); return [cos, sin, -sin, cos, 0, 0]; } - return [1, 0, 0, 1, 0, 0]; + return fabric.iMatrix.concat(); }, - /* + /** * calculate trasform Matrix that represent current transformation from * object properties. + * @param {Boolean} [skipGroup] return transformMatrix for object and not go upward with parents * @return {Array} matrix Transform Matrix for the object */ - calcTransformMatrix: function() { + 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 ? this.group.calcTransformMatrix() : [1, 0, 0, 1, 0, 0]; + matrix = this.group && !skipGroup ? this.group.calcTransformMatrix() : fabric.iMatrix.concat(); matrix = multiplyMatrices(matrix, translateMatrix); matrix = multiplyMatrices(matrix, rotateMatrix); matrix = multiplyMatrices(matrix, dimensionMatrix); @@ -13956,7 +14099,73 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.Stati scaleMatrix = [scaleX, 0, 0, scaleY], m = multiplyMatrices(scaleMatrix, skewMatrixX, true); return multiplyMatrices(m, skewMatrixY, true); - } + }, + + /* + * Calculate object dimensions from its properties + * @private + * @return {Object} .x width dimension + * @return {Object} .y height dimension + */ + _getNonTransformedDimensions: function() { + var strokeWidth = this.strokeWidth, + w = this.width + strokeWidth, + h = this.height + strokeWidth; + return { x: w, y: h }; + }, + + /* + * Calculate object bounding boxdimensions from its properties scale, skew. + * @private + * @return {Object} .x width dimension + * @return {Object} .y height dimension + */ + _getTransformedDimensions: function(skewX, skewY) { + if (typeof skewX === 'undefined') { + skewX = this.skewX; + } + if (typeof skewY === 'undefined') { + skewY = this.skewY; + } + var dimensions = this._getNonTransformedDimensions(), + dimX = dimensions.x / 2, dimY = dimensions.y / 2, + points = [ + { + x: -dimX, + y: -dimY + }, + { + x: dimX, + y: -dimY + }, + { + x: -dimX, + y: dimY + }, + { + x: dimX, + y: dimY + }], + i, transformMatrix = this._calcDimensionsTransformMatrix(skewX, skewY, false), + bbox; + for (i = 0; i < points.length; i++) { + points[i] = fabric.util.transformPoint(points[i], transformMatrix); + } + bbox = fabric.util.makeBoundingBoxFromPoints(points); + return { x: bbox.width, y: bbox.height }; + }, + + /* + * Calculate object dimensions for controls. include padding and canvas zoom + * private + */ + _calculateCurrentDimensions: function() { + var vpt = this.getViewportTransform(), + dim = this._getTransformedDimensions(), + p = fabric.util.transformPoint(dim, vpt, true); + + return p.scalarAdd(2 * this.padding); + }, }); })(); @@ -14403,66 +14612,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot } }, - /* - * Calculate object dimensions from its properties - * @private - */ - _getNonTransformedDimensions: function() { - var strokeWidth = this.strokeWidth, - w = this.width + strokeWidth, - h = this.height + strokeWidth; - return { x: w, y: h }; - }, - - /* - * @private - */ - _getTransformedDimensions: function(skewX, skewY) { - if (typeof skewX === 'undefined') { - skewX = this.skewX; - } - if (typeof skewY === 'undefined') { - skewY = this.skewY; - } - var dimensions = this._getNonTransformedDimensions(), - dimX = dimensions.x / 2, dimY = dimensions.y / 2, - points = [ - { - x: -dimX, - y: -dimY - }, - { - x: dimX, - y: -dimY - }, - { - x: -dimX, - y: dimY - }, - { - x: dimX, - y: dimY - }], - i, transformMatrix = this._calcDimensionsTransformMatrix(skewX, skewY, false), - bbox; - for (i = 0; i < points.length; i++) { - points[i] = fabric.util.transformPoint(points[i], transformMatrix); - } - bbox = fabric.util.makeBoundingBoxFromPoints(points); - return { x: bbox.width, y: bbox.height }; - }, - - /* - * private - */ - _calculateCurrentDimensions: function() { - var vpt = this.getViewportTransform(), - dim = this._getTransformedDimensions(), - p = fabric.util.transformPoint(dim, vpt, true); - - return p.scalarAdd(2 * this.padding); - }, - /** * Draws a colored layer behind the object, inside its selection borders. * Requires public options: padding, selectionBackgroundColor @@ -15256,14 +15405,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return reviver ? reviver(markup.join('')) : markup.join(''); }, /* _TO_SVG_END_ */ - - /** - * Returns complexity of an instance - * @return {Number} complexity - */ - complexity: function() { - return 1; - } }); /* _FROM_SVG_START_ */ @@ -15527,14 +15668,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this.radius = value; return this.set('width', value * 2).set('height', value * 2); }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance - */ - complexity: function() { - return 1; - } }); /* _FROM_SVG_START_ */ @@ -15697,14 +15830,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return reviver ? reviver(markup.join('')) : markup.join(''); }, /* _TO_SVG_END_ */ - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance - */ - complexity: function() { - return 1; - } }); /** @@ -15881,14 +16006,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot this._renderFill(ctx); this._renderStroke(ctx); }, - - /** - * Returns complexity of an instance - * @return {Number} complexity - */ - complexity: function() { - return 1; - } }); /* _FROM_SVG_START_ */ @@ -16117,14 +16234,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot return reviver ? reviver(markup.join('')) : markup.join(''); }, /* _TO_SVG_END_ */ - - /** - * Returns complexity of an instance - * @return {Number} complexity - */ - complexity: function() { - return 1; - } }); /* _FROM_SVG_START_ */ @@ -16180,7 +16289,11 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot 'use strict'; - var fabric = global.fabric || (global.fabric = { }); + var fabric = global.fabric || (global.fabric = { }), + extend = fabric.util.object.extend, + min = fabric.util.array.min, + max = fabric.util.array.max, + toFixed = fabric.util.toFixed; if (fabric.Polyline) { fabric.warn('fabric.Polyline is already defined'); @@ -16248,14 +16361,37 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * }); */ initialize: function(points, options) { - return fabric.Polygon.prototype.initialize.call(this, points, options); + options = options || {}; + this.points = points || []; + this.callSuper('initialize', options); + this._calcDimensions(); + if (!('top' in options)) { + this.top = this.minY; + } + if (!('left' in options)) { + this.left = this.minX; + } + this.pathOffset = { + x: this.minX + this.width / 2, + y: this.minY + this.height / 2 + }; }, /** * @private */ _calcDimensions: function() { - return fabric.Polygon.prototype._calcDimensions.call(this); + + var points = this.points, + minX = min(points, 'x'), + minY = min(points, 'y'), + maxX = max(points, 'x'), + maxY = max(points, 'y'); + + this.width = (maxX - minX) || 0; + this.height = (maxY - minY) || 0; + this.minX = minX || 0; + this.minY = minY || 0; }, /** @@ -16264,27 +16400,72 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @return {Object} Object representation of an instance */ toObject: function(propertiesToInclude) { - return fabric.Polygon.prototype.toObject.call(this, propertiesToInclude); + return extend(this.callSuper('toObject', propertiesToInclude), { + points: this.points.concat() + }); }, /* _TO_SVG_START_ */ /** - * Returns SVG representation of an instance + * Returns svg representation of an instance * @param {Function} [reviver] Method for further parsing of svg representation. * @return {String} svg representation of an instance */ toSVG: function(reviver) { - return fabric.Polygon.prototype.toSVG.call(this, reviver); + var points = [], addTransform, + markup = this._createBaseSVGMarkup(); + + for (var i = 0, len = this.points.length; i < len; i++) { + points.push(toFixed(this.points[i].x, 2), ',', toFixed(this.points[i].y, 2), ' '); + } + if (!(this.group && this.group.type === 'path-group')) { + addTransform = ' translate(' + (-this.pathOffset.x) + ', ' + (-this.pathOffset.y) + ') '; + } + markup.push( + '<', this.type, ' ', this.getSvgId(), + 'points="', points.join(''), + '" style="', this.getSvgStyles(), + '" transform="', this.getSvgTransform(), addTransform, + ' ', this.getSvgTransformMatrix(), + '"/>\n' + ); + + return reviver ? reviver(markup.join('')) : markup.join(''); }, /* _TO_SVG_END_ */ + + /** + * @private + * @param {CanvasRenderingContext2D} ctx Context to render on + * @param {Boolean} noTransform + */ + commonRender: function(ctx, noTransform) { + var point, len = this.points.length, + x = noTransform ? 0 : this.pathOffset.x, + y = noTransform ? 0 : this.pathOffset.y; + + if (!len || isNaN(this.points[len - 1].y)) { + // do not draw if no points or odd points + // NaN comes from parseFloat of a empty string in parser + return false; + } + ctx.beginPath(); + ctx.moveTo(this.points[0].x - x, this.points[0].y - y); + for (var i = 0; i < len; i++) { + point = this.points[i]; + ctx.lineTo(point.x - x, point.y - y); + } + return true; + }, + /** * @private * @param {CanvasRenderingContext2D} ctx Context to render on * @param {Boolean} noTransform */ _render: function(ctx, noTransform) { - if (!fabric.Polygon.prototype.commonRender.call(this, ctx, noTransform)) { + if (!this.commonRender(ctx, noTransform)) { return; } this._renderFill(ctx); @@ -16366,26 +16547,20 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot 'use strict'; var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - min = fabric.util.array.min, - max = fabric.util.array.max, - toFixed = fabric.util.toFixed; + extend = fabric.util.object.extend; if (fabric.Polygon) { fabric.warn('fabric.Polygon is already defined'); return; } - var cacheProperties = fabric.Object.prototype.cacheProperties.concat(); - cacheProperties.push('points'); - /** * Polygon class * @class fabric.Polygon - * @extends fabric.Object + * @extends fabric.Polyline * @see {@link fabric.Polygon#initialize} for constructor definition */ - fabric.Polygon = fabric.util.createClass(fabric.Object, /** @lends fabric.Polygon.prototype */ { + fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ { /** * Type of an object @@ -16394,109 +16569,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ type: 'polygon', - /** - * Points array - * @type Array - * @default - */ - points: null, - - /** - * Minimum X from points values, necessary to offset points - * @type Number - * @default - */ - minX: 0, - - /** - * Minimum Y from points values, necessary to offset points - * @type Number - * @default - */ - minY: 0, - - cacheProperties: cacheProperties, - - /** - * Constructor - * @param {Array} points Array of points - * @param {Object} [options] Options object - * @return {fabric.Polygon} thisArg - */ - initialize: function(points, options) { - options = options || {}; - this.points = points || []; - this.callSuper('initialize', options); - this._calcDimensions(); - if (!('top' in options)) { - this.top = this.minY; - } - if (!('left' in options)) { - this.left = this.minX; - } - this.pathOffset = { - x: this.minX + this.width / 2, - y: this.minY + this.height / 2 - }; - }, - - /** - * @private - */ - _calcDimensions: function() { - - var points = this.points, - minX = min(points, 'x'), - minY = min(points, 'y'), - maxX = max(points, 'x'), - maxY = max(points, 'y'); - - this.width = (maxX - minX) || 0; - this.height = (maxY - minY) || 0; - this.minX = minX || 0; - this.minY = minY || 0; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), { - points: this.points.concat() - }); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - var points = [], addTransform, - markup = this._createBaseSVGMarkup(); - - for (var i = 0, len = this.points.length; i < len; i++) { - points.push(toFixed(this.points[i].x, 2), ',', toFixed(this.points[i].y, 2), ' '); - } - if (!(this.group && this.group.type === 'path-group')) { - addTransform = ' translate(' + (-this.pathOffset.x) + ', ' + (-this.pathOffset.y) + ') '; - } - markup.push( - '<', this.type, ' ', this.getSvgId(), - 'points="', points.join(''), - '" style="', this.getSvgStyles(), - '" transform="', this.getSvgTransform(), addTransform, - ' ', this.getSvgTransformMatrix(), - '"/>\n' - ); - - return reviver ? reviver(markup.join('')) : markup.join(''); - }, - /* _TO_SVG_END_ */ - /** * @private * @param {CanvasRenderingContext2D} ctx Context to render on @@ -16506,35 +16578,9 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot if (!this.commonRender(ctx, noTransform)) { return; } + ctx.closePath(); this._renderFill(ctx); - if (this.stroke || this.strokeDashArray) { - ctx.closePath(); - this._renderStroke(ctx); - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Boolean} noTransform - */ - commonRender: function(ctx, noTransform) { - var point, len = this.points.length, - x = noTransform ? 0 : this.pathOffset.x, - y = noTransform ? 0 : this.pathOffset.y; - - if (!len || isNaN(this.points[len - 1].y)) { - // do not draw if no points or odd points - // NaN comes from parseFloat of a empty string in parser - return false; - } - ctx.beginPath(); - ctx.moveTo(this.points[0].x - x, this.points[0].y - y); - for (var i = 0; i < len; i++) { - point = this.points[i]; - ctx.lineTo(point.x - x, point.y - y); - } - return true; + this._renderStroke(ctx); }, /** @@ -16542,17 +16588,9 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {CanvasRenderingContext2D} ctx Context to render on */ _renderDashedStroke: function(ctx) { - fabric.Polyline.prototype._renderDashedStroke.call(this, ctx); + this.callSuper('_renderDashedStroke', ctx); ctx.closePath(); }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance - */ - complexity: function() { - return this.points.length; - } }); /* _FROM_SVG_START_ */ @@ -17089,7 +17127,9 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot */ toObject: function(propertiesToInclude) { var o = extend(this.callSuper('toObject', ['sourcePath', 'pathOffset'].concat(propertiesToInclude)), { - path: this.path.map(function(item) { return item.slice(); }) + path: this.path.map(function(item) { return item.slice(); }), + top: this.top, + left: this.left, }); return o; }, @@ -17841,22 +17881,22 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot * @param {Function} [callback] Callback to invoke when an fabric.PathGroup instance is created */ fabric.PathGroup.fromObject = function(object, callback) { + var originalPaths = object.paths; + delete object.paths; // remove this pattern from 2.0 accepts only object - if (typeof object.paths === 'string') { - fabric.loadSVGFromURL(object.paths, function (elements) { - - var pathUrl = object.paths; - delete object.paths; - + if (typeof orignalPaths === 'string') { + fabric.loadSVGFromURL(originalPaths, function (elements) { + var pathUrl = originalPaths; var pathGroup = fabric.util.groupSVGElements(elements, object, pathUrl); - + object.paths = originalPaths; callback(pathGroup); }); } else { - fabric.util.enlivenObjects(object.paths, function(enlivenedObjects) { - delete object.paths; - callback(new fabric.PathGroup(enlivenedObjects, object)); + fabric.util.enlivenObjects(originalPaths, function(enlivenedObjects) { + var pathGroup = new fabric.PathGroup(enlivenedObjects, object); + object.paths = originalPaths; + callback(pathGroup); }); } }; @@ -18003,15 +18043,13 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot var objectLeft = object.getLeft(), objectTop = object.getTop(), - ignoreZoom = true; + ignoreZoom = true, skipAbsolute = true; object.set({ - originalLeft: objectLeft, - originalTop: objectTop, left: objectLeft - center.x, top: objectTop - center.y }); - object.setCoords(ignoreZoom); + object.setCoords(ignoreZoom, skipAbsolute); }, /** @@ -18298,14 +18336,14 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot }, /** - * Sets coordinates of all group objects + * Sets coordinates of all objects inside group * @return {fabric.Group} thisArg * @chainable */ setObjectsCoords: function() { - var ignoreZoom = true; + var ignoreZoom = true, skipAbsolute = true; this.forEachObject(function(object) { - object.setCoords(ignoreZoom); + object.setCoords(ignoreZoom, skipAbsolute); }); return this; }, @@ -19046,14 +19084,6 @@ fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prot ? this.getElement().height || 0 : 0); }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance - */ - complexity: function() { - return 1; - } }); /** @@ -23747,17 +23777,9 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.mouseMoveHandler = this.mouseMoveHandler.bind(this); }, - /** - * Initializes "selected" event handler - */ - initSelectedHandler: function() { - this.on('selected', function() { - - var _this = this; - setTimeout(function() { - _this.selected = true; - }, 100); - }); + onDeselect: function() { + this.isEditing && this.exitEditing(); + this.selected = false; }, /** @@ -23798,9 +23820,6 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { * @private */ _initCanvasHandlers: function(canvas) { - canvas._canvasITextSelectionClearedHanlder = (function() { - fabric.IText.prototype.exitEditingOnOthers(canvas); - }).bind(this); canvas._mouseUpITextHandler = (function() { if (canvas._iTextInstances) { canvas._iTextInstances.forEach(function(obj) { @@ -23808,8 +23827,6 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { }); } }).bind(this); - canvas.on('selection:cleared', canvas._canvasITextSelectionClearedHanlder); - canvas.on('object:selected', canvas._canvasITextSelectionClearedHanlder); canvas.on('mouse:up', canvas._mouseUpITextHandler); }, @@ -23818,8 +23835,6 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { * @private */ _removeCanvasHandlers: function(canvas) { - canvas.off('selection:cleared', canvas._canvasITextSelectionClearedHanlder); - canvas.off('object:selected', canvas._canvasITextSelectionClearedHanlder); canvas.off('mouse:up', canvas._mouseUpITextHandler); }, @@ -24141,7 +24156,11 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { var newSelectionStart = this.getSelectionStartFromPointer(options.e), currentStart = this.selectionStart, currentEnd = this.selectionEnd; - if (newSelectionStart === this.__selectionStartOnMouseDown) { + if ( + (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd) + && + (currentStart === newSelectionStart || currentEnd === newSelectionStart) + ) { return; } if (newSelectionStart > this.__selectionStartOnMouseDown) { @@ -24153,6 +24172,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.selectionEnd = this.__selectionStartOnMouseDown; } if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) { + this.restartCursorIfNeeded(); this._fireSelectionChanged(); this._updateTextarea(); this.renderCursorOrSelection(); @@ -24290,9 +24310,12 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.selectable = true; this.selectionEnd = this.selectionStart; - this.hiddenTextarea.blur && this.hiddenTextarea.blur(); - this.hiddenTextarea && this.canvas && this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea); - this.hiddenTextarea = null; + + if (this.hiddenTextarea) { + this.hiddenTextarea.blur && this.hiddenTextarea.blur(); + this.canvas && this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea); + this.hiddenTextarea = null; + } this.abortCursorAnimation(); this._restoreEditingProps(); @@ -24305,7 +24328,6 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.canvas.fire('text:editing:exited', { target: this }); isTextChanged && this.canvas.fire('object:modified', { target: this }); } - return this; }, @@ -24387,8 +24409,19 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.setCoords(); this._fireSelectionChanged(); this.fire('changed'); - this.canvas && this.canvas.fire('text:changed', { target: this }); - this.canvas && this.canvas.renderAll(); + this.restartCursorIfNeeded(); + if (this.canvas) { + this.canvas.fire('text:changed', { target: this }); + this.canvas.renderAll(); + } + }, + + restartCursorIfNeeded: function() { + if (!this._currentTickState || this._currentTickState.isAborted + || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted + ) { + this.initDelayedCursor(); + } }, /** @@ -24689,7 +24722,6 @@ fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.protot * Initializes event handlers related to cursor or selection */ initCursorSelectionHandlers: function() { - this.initSelectedHandler(); this.initMousedownHandler(); this.initMouseupHandler(); this.initClicks(); diff --git a/dist/fabric.min.js b/dist/fabric.min.js index 81147c90..4c5341a2 100644 --- a/dist/fabric.min.js +++ b/dist/fabric.min.js @@ -1,9 +1,9 @@ -var fabric=fabric||{version:"1.7.3"};"undefined"!=typeof exports&&(exports.fabric=fabric),"undefined"!=typeof document&&"undefined"!=typeof window?(fabric.document=document,fabric.window=window,window.fabric=fabric):(fabric.document=require("jsdom").jsdom(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E")),fabric.document.createWindow?fabric.window=fabric.document.createWindow():fabric.window=fabric.document.parentWindow),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode="undefined"!=typeof Buffer&&"undefined"==typeof window,fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id"],fabric.DPI=96,fabric.reNum="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",fabric.fontPaths={},fabric.charWidthsCache={},fabric.devicePixelRatio=fabric.window.devicePixelRatio||fabric.window.webkitDevicePixelRatio||fabric.window.mozDevicePixelRatio||1,function(){function t(t,e){if(this.__eventListeners[t]){var i=this.__eventListeners[t];e?i[i.indexOf(e)]=!1:fabric.util.array.fill(i,!1)}}function e(t,e){if(this.__eventListeners||(this.__eventListeners={}),1===arguments.length)for(var i in t)this.on(i,t[i]);else this.__eventListeners[t]||(this.__eventListeners[t]=[]),this.__eventListeners[t].push(e);return this}function i(e,i){if(this.__eventListeners){if(0===arguments.length)for(e in this.__eventListeners)t.call(this,e);else if(1===arguments.length&&"object"==typeof arguments[0])for(var r in e)t.call(this,r,e[r]);else t.call(this,e,i);return this}}function r(t,e){if(this.__eventListeners){var i=this.__eventListeners[t];if(i){for(var r=0,n=i.length;r-1},complexity:function(){return this.getObjects().reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},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.getContext||"undefined"==typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(t),t},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(t){var e,i,r,n,s,o=t.prototype;for(e=o.stateProperties.length;e--;)i=o.stateProperties[e],r=i.charAt(0).toUpperCase()+i.slice(1),n="set"+r,s="get"+r,o[s]||(o[s]=function(t){return new Function('return this.get("'+t+'")')}(i)),o[n]||(o[n]=function(t){return new Function("value",'return this.set("'+t+'", value)')}(i))},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?D-=2*f:1===c&&D<0&&(D+=2*f);for(var I=Math.ceil(Math.abs(D/f*2)),E=[],L=D/I,F=8/3*Math.sin(L/4)*Math.sin(L/4)/Math.sin(L/2),R=A+L,B=0;B=n?s-n:2*Math.PI-(n-s)}function r(t,e,i,r,n,s,h,c){var l=a.call(arguments);if(o[l])return o[l];var u,f,d,g,p,v,b,m,y=Math.sqrt,_=Math.min,x=Math.max,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 O=0;O<2;++O)if(O>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),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>>0;if(0===i)return-1;var r=0;if(arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=i)return-1;for(var n=r>=0?r:Math.max(i-Math.abs(r),0);n>>0;i>>0;r>>0;i>>0;i>>0;n>>0,r=0;if(arguments.length>1)e=arguments[1];else for(;;){if(r in this){e=this[r++];break}if(++r>=i)throw new TypeError}for(;r/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:t,capitalize:e,escapeXml:i}}(),function(){var t=Array.prototype.slice,e=Function.prototype.apply,i=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var n,s=this,o=t.call(arguments,1);return n=o.length?function(){return e.call(s,this instanceof i?this:r,o.concat(t.call(arguments)))}:function(){return e.call(s,this instanceof i?this:r,arguments)},i.prototype=this.prototype,n.prototype=new i,n})}(),function(){function t(){}function e(t){var e=this.constructor.superclass.prototype[t];return arguments.length>1?e.apply(this,r.call(arguments,1)):e.call(this)}function i(){function i(){this.initialize.apply(this,arguments)}var s=null,a=r.call(arguments,0);"function"==typeof a[0]&&(s=a.shift()),i.superclass=s,i.subclasses=[],s&&(t.prototype=s.prototype,i.prototype=new t,s.subclasses.push(i));for(var h=0,c=a.length;h-1?t.prototype[r]=function(t){return function(){var r=this.constructor.superclass;this.constructor.superclass=i;var n=e[t].apply(this,arguments);if(this.constructor.superclass=r,"initialize"!==t)return n}}(r):t.prototype[r]=e[r],s&&(e.toString!==Object.prototype.toString&&(t.prototype.toString=e.toString),e.valueOf!==Object.prototype.valueOf&&(t.prototype.valueOf=e.valueOf))};fabric.util.createClass=i}(),function(){function t(t){var e,i,r=Array.prototype.slice.call(arguments,1),n=r.length;for(i=0;i-1?s(t,e.match(/opacity:\s*(\d?\.?\d*)/)[1]):t;for(var r in e)if("opacity"===r)s(t,e[r]);else{var n="float"===r||"cssFloat"===r?"undefined"==typeof i.styleFloat?"cssFloat":"styleFloat":r;i[n]=e[r]}return t}var e=fabric.document.createElement("div"),i="string"==typeof e.style.opacity,r="string"==typeof e.style.filter,n=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(t){return t};i?s=function(t,e){return t.style.opacity=e,t}:r&&(s=function(t,e){var i=t.style;return t.currentStyle&&!t.currentStyle.hasLayout&&(i.zoom=1),n.test(i.filter)?(e=e>=.9999?"":"alpha(opacity="+100*e+")",i.filter=i.filter.replace(n,e)):i.filter+=" alpha(opacity="+100*e+")",t}),fabric.util.setStyle=t}(),function(){function t(t){return"string"==typeof t?fabric.document.getElementById(t):t}function e(t,e){var i=fabric.document.createElement(t);for(var r in e)"class"===r?i.className=e[r]:"for"===r?i.htmlFor=e[r]:i.setAttribute(r,e[r]);return i}function i(t,e){t&&(" "+t.className+" ").indexOf(" "+e+" ")===-1&&(t.className+=(t.className?" ":"")+e)}function r(t,i,r){return"string"==typeof i&&(i=e(i,r)),t.parentNode&&t.parentNode.replaceChild(i,t),i.appendChild(t),i}function n(t){for(var e=0,i=0,r=fabric.document.documentElement,n=fabric.document.body||{scrollLeft:0,scrollTop:0};t&&(t.parentNode||t.host)&&(t=t.parentNode||t.host,t===fabric.document?(e=n.scrollLeft||r.scrollLeft||0,i=n.scrollTop||r.scrollTop||0):(e+=t.scrollLeft||0,i+=t.scrollTop||0),1!==t.nodeType||"fixed"!==fabric.util.getElementStyle(t,"position")););return{left:e,top:i}}function s(t){var e,i,r=t&&t.ownerDocument,s={left:0,top:0},o={left:0,top:0},a={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!r)return o;for(var h in a)o[a[h]]+=parseInt(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(t){e(function(i){t||(t={});var r,n=i||+new Date,s=t.duration||500,o=n+s,a=t.onChange||function(){},h=t.abort||function(){return!1},c=t.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},l="startValue"in t?t.startValue:0,u="endValue"in t?t.endValue:100,f=t.byValue||u-l;t.onStart&&t.onStart(),function i(u){r=u||+new Date;var d=r>o?s:r-n;return h()?void(t.onComplete&&t.onComplete()):(a(c(d,l,f,s)),r>o?void(t.onComplete&&t.onComplete()):void e(i))}(n)})}function e(){return i.apply(fabric.window,arguments)}var i=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(t){fabric.window.setTimeout(t,1e3/60)};fabric.util.animate=t,fabric.util.requestAnimFrame=e}(),function(){function t(t,e,i){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 _;if((f||d)&&(x=" translate("+y(f)+" "+y(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),_}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,b=p.util.object.clone,m=p.util.toFixed,y=p.util.parseUnit,_=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,O={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"},T={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*$",b=new RegExp(v),m=new RegExp(d,"g");return function(s){var o=n.concat(),a=[];if(!s||s&&!b.test(s))return o;s.replace(m,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 j=new RegExp("^\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*$");p.parseSVGDocument=function(t,e,i){if(t){f(t);var r=p.Object.__uid++,n=d(t),s=p.util.toArray(t.getElementsByTagName("*"));if(n.svgUid=r,0===s.length&&p.isLikelyNode){s=t.selectNodes('//*[name(.)!="svg"]');for(var o=[],a=0,h=s.length;a/i,""))),r&&r.documentElement||e&&e(null),p.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)}t=t.replace(/^\n\s*/,"").trim(),new p.util.request(t,{method:"get",onComplete:r})},loadSVGFromString:function(t,e,i){t=t.trim();var r;if("undefined"!=typeof DOMParser){var n=new DOMParser;n&&n.parseFromString&&(r=n.parseFromString(t,"text/xml"))}else p.window.ActiveXObject&&(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(t.replace(//i,"")));p.parseSVGDocument(r.documentElement,function(t,i){e(t,i)},i)}})}("undefined"!=typeof exports?exports:this),fabric.ElementsParser=function(t,e,i,r){this.elements=t,this.callback=e,this.options=i,this.reviver=r,this.svgUid=i&&i.svgUid||0},fabric.ElementsParser.prototype.parse=function(){this.instances=new Array(this.elements.length),this.numElements=this.elements.length,this.createObjects()},fabric.ElementsParser.prototype.createObjects=function(){for(var t=0,e=this.elements.length;tt.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,i){return"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}fabric.Gradient=fabric.util.createClass({offsetX:0,offsetY:0,initialize:function(t){t||(t={});var e={};this.id=fabric.Object.__uid++,this.type=t.type||"linear",e={x1:t.coords.x1||0,y1:t.coords.y1||0,x2:t.coords.x2||0,y2:t.coords.y2||0},"radial"===this.type&&(e.r1=t.coords.r1||0,e.r2=t.coords.r2||0),this.coords=e,this.colorStops=t.colorStops.slice(),t.gradientTransform&&(this.gradientTransform=t.gradientTransform),this.offsetX=t.offsetX||this.offsetX,this.offsetY=t.offsetY||this.offsetY},addColorStop:function(t){for(var e in t){var i=new fabric.Color(t[e]);this.colorStops.push({offset:e,color:i.toRgb(),opacity:i.getAlpha()})}return this},toObject:function(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=fabric.util.object.clone(this.coords);if(this.colorStops.sort(function(t,e){return t.offset-e.offset}),!t.group||"path-group"!==t.group.type)for(var n in r)"x1"===n||"x2"===n||"r2"===n?r[n]+=this.offsetX-t.width/2:"y1"!==n&&"y2"!==n||(r[n]+=this.offsetY-t.height/2);i='id="SVGID_'+this.id+'" gradientUnits="userSpaceOnUse"',this.gradientTransform&&(i+=' gradientTransform="matrix('+this.gradientTransform.join(" ")+')" '),"linear"===this.type?e=["\n']:"radial"===this.type&&(e=["\n']);for(var s=0;s\n');return e.push("linear"===this.type?"\n":"\n"),e.join("")},toLive:function(t,e){var i,r,n=fabric.util.object.clone(this.coords);if(this.type){if(e.group&&"path-group"===e.group.type)for(r in n)"x1"===r||"x2"===r?n[r]+=-this.offsetX+e.width/2:"y1"!==r&&"y2"!==r||(n[r]+=-this.offsetY+e.height/2);"linear"===this.type?i=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(i=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2));for(var s=0,o=this.colorStops.length;s\n\n\n'},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=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e||(e={}),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:[1,0,0,1,0,0],backgroundVpt:!0,overlayVpt:!0,onBeforeScaleRotate:function(){},enableRetinaScaling:!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 n;if("undefined"==typeof e.getContext)throw n;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()},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&&ci.padding?t.x<0?t.x+=i.padding:t.x-=i.padding:t.x=0,n(t.y)>i.padding?t.y<0?t.y+=i.padding:t.y-=i.padding:t.y=0},_rotateObject:function(t,e){var n=this._currentTransform;if(n.target.get("lockRotation"))return!1;var s=r(n.ey-n.top,n.ex-n.left),o=r(e-n.top,t-n.left),a=i(o-s+n.theta),h=!0;if(a<0&&(a=360+a),a%=360,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(s&&!e&&this._checkTarget(n,s))return this._fireOverOutEvents(s,t),s;if(o&&o._findTargetCorner(n))return this._fireOverOutEvents(o,t),o;if(o&&this._checkTarget(n,o)){if(!this.preserveObjectStacking)return this._fireOverOutEvents(o,t),o;i=o}this.targets=[];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){t?this._hoveredTarget!==t&&(this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout")),this.fire("mouse:over",{target:t,e:e}),t.fire("mouseover"),this._hoveredTarget=t):this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout"),this._hoveredTarget=null)},_checkTarget:function(t,e){if(e&&e.visible&&e.evented&&this.containsPoint(null,e,t)){if(!this.perPixelTargetFind&&!e.perPixelTargetFind||e.isEditing)return!0;var i=this.isTargetTransparent(e,t.x,t.y);if(!i)return!0}},_searchPossibleTargets:function(t,e){for(var i,r,n,s=t.length;s--;)if(this._checkTarget(e,t[s])){i=t[s],"group"===i.type&&i.subTargetCheck&&(r=this._normalizePointer(i,e),n=this._searchPossibleTargets(i._objects,r),n&&this.targets.push(n));break}return i},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._createCanvasElement(),fabric.util.addClass(this.upperCanvasEl,"upper-canvas "+t),this.wrapperEl.appendChild(this.upperCanvasEl),this._copyCanvasStyle(this.lowerCanvasEl,this.upperCanvasEl),this._applyCanvasStyle(this.upperCanvasEl),this.contextTop=this.upperCanvasEl.getContext("2d")},_createCacheCanvas:function(){this.cacheCanvasEl=this._createCanvasElement(),this.cacheCanvasEl.setAttribute("width",this.width),this.cacheCanvasEl.setAttribute("height",this.height),this.contextCache=this.cacheCanvasEl.getContext("2d")},_initWrapperElement:function(){this.wrapperEl=fabric.util.wrapElement(this.lowerCanvasEl,"div",{class:this.containerClass}),fabric.util.setStyle(this.wrapperEl,{width:this.getWidth()+"px",height:this.getHeight()+"px",position:"relative"}),fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(t){var e=this.getWidth()||t.width,i=this.getHeight()||t.height;fabric.util.setStyle(t,{position:"absolute",width:e+"px",height:i+"px",left:0,top:0}),t.width=e,t.height=i,fabric.util.makeElementUnselectable(t)},_copyCanvasStyle:function(t,e){e.style.cssText=t.style.cssText},getSelectionContext:function(){return this.contextTop},getSelectionElement:function(){return this.upperCanvasEl},_setActiveObject:function(t){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=t,t.set("active",!0)},setActiveObject:function(t,e){return this._setActiveObject(t),this.renderAll(),this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e}),this},getActiveObject:function(){return this._activeObject},_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.callSuper("_onObjectRemoved",t)},_discardActiveObject:function(){this._activeObject&&this._activeObject.set("active",!1),this._activeObject=null},discardActiveObject:function(t){var e=this._activeObject;return this.fire("before:selection:cleared",{target:e,e:t}),this._discardActiveObject(),this.fire("selection:cleared",{e:t}),e&&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 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.renderAll()},_performTransformAction:function(t,e,i){var r=i.x,n=i.y,s=e.target,o=e.action,a=!1;"rotate"===o?(a=this._rotateObject(r,n))&&this._fire("rotating",s,t):"scale"===o?(a=this._onScale(t,e,r,n))&&this._fire("scaling",s,t):"scaleX"===o?(a=this._scaleObject(r,n,"x"))&&this._fire("scaling",s,t):"scaleY"===o?(a=this._scaleObject(r,n,"y"))&&this._fire("scaling",s,t):"skewX"===o?(a=this._skewObject(r,n,"x"))&&this._fire("skewing",s,t):"skewY"===o?(a=this._skewObject(r,n,"y"))&&this._fire("skewing",s,t):(a=this._translateObject(r,n),a&&(this._fire("moving",s,t),this.setCursor(s.moveCursor||this.moveCursor))),e.actionPerformed=e.actionPerformed||a},_fire:function(t,e,i){this.fire("object:"+t,{target:e,e:i}),e.fire(t,{e:i})},_beforeScaleTransform:function(t,e){if("scale"===e.action||"scaleX"===e.action||"scaleY"===e.action){var i=this._shouldCenterTransform(e.target);(i&&("center"!==e.originX||"center"!==e.originY)||!i&&"center"===e.originX&&"center"===e.originY)&&(this._resetCurrentTransform(),e.reset=!0)}},_onScale:function(t,e,i,r){return!t[this.uniScaleKey]&&!this.uniScaleTransform||e.target.get("lockUniScaling")?(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally")):(e.currentAction="scale",this._scaleObject(i,r))},_setCursorFromEvent:function(t,e){if(!e)return this.setCursor(this.defaultCursor),!1;var i=e.hoverCursor||this.hoverCursor;if(e.selectable){var r=this.getActiveGroup(),n=e._findTargetCorner&&(!r||!r.contains(e))&&e._findTargetCorner(this.getPointer(t,!0));n?this._setCornerCursor(n,e,t):this.setCursor(i)}else this.setCursor(i);return!0},_setCornerCursor:function(e,i,r){if(e in t)this.setCursor(this._getRotatedCornerCursor(e,i,r));else{if("mtr"!==e||!i.hasRotatingPoint)return this.setCursor(this.defaultCursor),!1;this.setCursor(this.rotationCursor)}},_getRotatedCornerCursor:function(e,i,r){var n=Math.round(i.getAngle()%360/45);return n<0&&(n+=8),n+=t[e],r[this.altActionKey]&&t[e]%2===0&&(n+=2),n%=8,this.cursorMap[n]}})}(),function(){var t=Math.min,e=Math.max;fabric.util.object.extend(fabric.Canvas.prototype,{_shouldGroup:function(t,e){var i=this.getActiveObject();return t[this.selectionKey]&&e&&e.selectable&&(this.getActiveGroup()||i&&i!==e)&&this.selection},_handleGrouping:function(t,e){var i=this.getActiveGroup();(e!==i||(e=this.findTarget(t,!0)))&&(i?this._updateActiveGroup(e,t):this._createActiveGroup(e,t),this._activeGroup&&this._activeGroup.saveCoords())},_updateActiveGroup:function(t,e){var i=this.getActiveGroup();if(i.contains(t)){if(i.removeWithUpdate(t),t.set("active",!1),1===i.size())return this.discardActiveGroup(e),void this.setActiveObject(i.item(0))}else i.addWithUpdate(t);this.fire("selection:created",{target:i,e:e}),i.set("active",!0)},_createActiveGroup:function(t,e){if(this._activeObject&&t!==this._activeObject){var i=this._createGroup(t);i.addWithUpdate(),this.setActiveGroup(i),this._activeObject=null,this.fire("selection:created",{target:i,e:e})}t.set("active",!0)},_createGroup:function(t){var e=this.getObjects(),i=e.indexOf(this._activeObject)1&&(e=new fabric.Group(e.reverse(),{canvas:this}),e.addWithUpdate(),this.setActiveGroup(e,t),e.saveCoords(),this.fire("selection:created",{target:e}),this.renderAll())},_collectObjects:function(){for(var i,r=[],n=this._groupSelector.ex,s=this._groupSelector.ey,o=n+this._groupSelector.left,a=s+this._groupSelector.top,h=new fabric.Point(t(n,o),t(s,a)),c=new fabric.Point(e(n,o),e(s,a)),l=n===o&&s===a,u=this._objects.length;u--&&(i=this._objects[u],!(i&&i.selectable&&i.visible&&(i.intersectsWithRect(h,c)||i.isContainedWithinRect(h,c)||i.containsPoint(h)||i.containsPoint(c))&&(i.set("active",!0),r.push(i),l))););return r},_maybeGroupObjects:function(t){this.selection&&this._groupSelector&&this._groupSelectedObjects(t);var e=this.getActiveGroup();e&&(e.setObjectsCoords().setCoords(),e.isMoving=!1,this.setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),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.getWidth(),s=this.getHeight(),o=(i.width||this.getWidth())*r,a=(i.height||this.getHeight())*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);this.clear();var n=this;return this._enlivenObjects(r.objects,function(){n._setBgOverlay(r,function(){delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay,n._setOptions(r),e&&e()})},i),this}},_setBgOverlay:function(t,e){var i=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!(t.backgroundImage||t.overlayImage||t.background||t.overlay))return void(e&&e());var n=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(i.renderAll(),e&&e())};this.__setBgOverlay("backgroundImage",t.backgroundImage,r,n),this.__setBgOverlay("overlayImage",t.overlayImage,r,n),this.__setBgOverlay("backgroundColor",t.background,r,n),this.__setBgOverlay("overlayColor",t.overlay,r,n)},__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){var r=this;if(!t||0===t.length)return void(e&&e());var n=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(t,function(t){t.forEach(function(t,e){r.insertAt(t,e)}),r.renderOnAddRemove=n,e&&e()},null,i)},_toDataURL:function(t,e){this.clone(function(i){e(i.toDataURL(t))})},_toDataURLWithMultiplier:function(t,e,i){this.clone(function(r){i(r.toDataURLWithMultiplier(t,e))})},clone:function(t,e){var i=JSON.stringify(this.toJSON(e));this.cloneWithoutData(function(e){e.loadFromJSON(i,function(){t&&t(e)})})},cloneWithoutData:function(t){var e=fabric.document.createElement("canvas");e.width=this.getWidth(),e.height=this.getHeight();var i=new fabric.Canvas(e);i.clipTo=this.clipTo,this.backgroundImage?(i.setBackgroundImage(this.backgroundImage.src,function(){i.renderAll(),t&&t(i)}),i.backgroundImageOpacity=this.backgroundImageOpacity,i.backgroundImageStretch=this.backgroundImageStretch):t&&t(i)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.object.clone,n=e.util.toFixed,s=e.util.string.capitalize,o=e.util.degreesToRadians,a=e.StaticCanvas.supports("setLineDash"),h=!e.isLikelyNode;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:!1,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill fillRule globalCompositeOperation shadow clipTo visible backgroundColor skewX skewY".split(" "),cacheProperties:"fill stroke strokeWidth strokeDashArray width height stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit fillRule backgroundColor".split(" "),initialize:function(t){t=t||{},t&&this.setOptions(t),this.objectCaching&&(this._createCacheCanvas(),this.setupState({propertySet:"cacheProperties"}))},_createCacheCanvas:function(){this._cacheCanvas=e.document.createElement("canvas"),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas()},_getCacheCanvasDimensions:function(){var t=this.canvas&&this.canvas.getZoom()||1,i=this.getObjectScaling(),r=this._getNonTransformedDimensions(),n=this.canvas&&this.canvas._isRetinaScaling()?e.devicePixelRatio:1,s=i.scaleX*t*n,o=i.scaleY*t*n,a=r.x*s,h=r.y*o;return{width:Math.ceil(a)+2,height:Math.ceil(h)+2,zoomX:s,zoomY:o}},_updateCacheCanvas:function(){if(this.noScaleCache&&this.canvas&&this.canvas._currentTransform){var t=this.canvas._currentTransform.action;if("scale"===t.slice(0,5))return!1}var e=this._getCacheCanvasDimensions(),i=e.width,r=e.height,n=e.zoomX,s=e.zoomY;return(i!==this.cacheWidth||r!==this.cacheHeight)&&(this._cacheCanvas.width=i,this._cacheCanvas.height=r,this._cacheContext.translate(i/2,r/2),this._cacheContext.scale(n,s),this.cacheWidth=i,this.cacheHeight=r,this.zoomX=n,this.zoomY=s,!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===this.canvas._activeGroup&&this.group.transform(t);var i=e?this._getLeftTopCoords():this.getCenterPoint();t.translate(i.x,i.y),t.rotate(o(this.angle)),t.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1)),t.transform(1,0,Math.tan(o(this.skewX)),1,0,0),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.getAngle(),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}},_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),"width"!==t&&"height"!==t||(this.minScaleLimit=Math.min(.1,1/Math.max(this.width,this.height))),this},setOnGroup:function(){},setSourcePath:function(t){return this.sourcePath=t,this},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:[1,0,0,1,0,0]},render:function(t,i){0===this.width&&0===this.height||!this.visible||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),i||this.transform(t),this._setOpacity(t),this._setShadow(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.clipTo&&e.util.clipContext(this,t),this.objectCaching&&!this.group?(this.isCacheDirty(i)&&(this.statefullCache&&this.saveState({propertySet:"cacheProperties"}),this.drawObject(this._cacheContext,i),this.dirty=!1),this.drawCacheOnCanvas(t)):(this.drawObject(t,i),i&&this.objectCaching&&this.statefullCache&&this.saveState({propertySet:"cacheProperties"})),this.clipTo&&t.restore(),t.restore())},drawObject:function(t,e){this._renderBackground(t),this._setStrokeStyles(t),this._setFillStyles(t),this._render(t,e)},drawCacheOnCanvas:function(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheWidth/2,-this.cacheHeight/2)},isCacheDirty:function(t){if(!t&&this._updateCacheCanvas())return!0;if(this.dirty||this.statefullCache&&this.hasStateChanged("cacheProperties")){if(!t){var e=this._getNonTransformedDimensions();this._cacheContext.clearRect(-e.x/2,-e.y/2,e.x,e.y)}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){t.globalAlpha*=this.opacity},_setStrokeStyles:function(t){this.stroke&&(t.lineWidth=this.strokeWidth,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,t.strokeStyle=this.stroke.toLive?this.stroke.toLive(t,this):this.stroke)},_setFillStyles:function(t){this.fill&&(t.fillStyle=this.fill.toLive?this.fill.toLive(t,this):this.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),a?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){if(!(!this.active||i||this.group&&this.group!==this.canvas.getActiveGroup())){var r,n=this.getViewportTransform(),s=this.calcTransformMatrix();s=e.util.multiplyTransformMatrices(n,s),r=e.util.qrDecompose(s),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)),this.drawBordersInGroup(t,r)):(t.rotate(o(this.angle)),this.drawBorders(t)),this.drawControls(t),t.restore()}},_setShadow:function(t){if(this.shadow){var i=this.canvas&&this.canvas.viewportTransform[0]||1,r=this.canvas&&this.canvas.viewportTransform[3]||1,n=this.getObjectScaling();this.canvas&&this.canvas._isRetinaScaling()&&(i*=e.devicePixelRatio,r*=e.devicePixelRatio),t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*(i+r)*(n.scaleX+n.scaleY)/4,t.shadowOffsetX=this.shadow.offsetX*i*n.scaleX,t.shadowOffsetY=this.shadow.offsetY*r*n.scaleY}},_removeShadow:function(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)},_applyPatternGradientTransform:function(t,e){if(e.toLive){var i=e.gradientTransform||e.patternTransform;i&&t.transform.apply(t,i);var r=-this.width/2+e.offsetX||0,n=-this.height/2+e.offsetY||0;t.translate(r,n)}},_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())},clone:function(t,i){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(i),t):new e.Object(this.toObject(i))},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.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new e.Point(n.getWidth()/2,n.getHeight()/2),"center","center");var o=this.canvas;n.add(this);var a=n.toDataURL(t);return this.set(s).setCoords(),this.canvas=o,n.dispose(),n=null,a},isType:function(t){return this.type===t},complexity:function(){return 0},toJSON:function(t){return this.toObject(t)},setGradient:function(t,i){i||(i={});var r={colorStops:[]};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.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,o){var a=e[t];if(i=r(i,!0),!s){var h=o?new a(i[o],i):new a(i);return n&&n(h),h}e.util.enlivenPatterns([i.fill,i.stroke],function(t){i.fill=t[0],i.stroke=t[1];var e=o?new a(i[o],i):new a(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.getWidth(),a=Math.cos(s)*o,h=Math.sin(s)*o;r="string"==typeof this.originX?e[this.originX]:this.originX-.5,n="string"==typeof i?e[i]:i-.5,this.left+=a*(n-r),this.top+=h*(n-r),this.setCoords(),this.originX=i},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var t=this.getCenterPoint();this.originX="center",this.originY="center",this.left=t.x,this.top=t.y},_resetOrigin:function(){var t=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY);this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=t.x,this.top=t.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","top")}})}(),function(){function t(t){return[new fabric.Point(t.tl.x,t.tl.y),new fabric.Point(t.tr.x,t.tr.y),new fabric.Point(t.br.x,t.br.y),new fabric.Point(t.bl.x,t.bl.y)]}var e=fabric.util.degreesToRadians,i=fabric.util.multiplyTransformMatrices;fabric.util.object.extend(fabric.Object.prototype,{ -oCoords:null,intersectsWithRect:function(e,i){var r=t(this.oCoords),n=fabric.Intersection.intersectPolygonRectangle(r,e,i);return"Intersection"===n.status},intersectsWithObject:function(e){var i=fabric.Intersection.intersectPolygonPolygon(t(this.oCoords),t(e.oCoords));return"Intersection"===i.status||e.isContainedWithinObject(this)||this.isContainedWithinObject(e)},isContainedWithinObject:function(e){for(var i=t(this.oCoords),r=0;r<4;r++)if(!e.containsPoint(i[r]))return!1;return!0},isContainedWithinRect:function(t,e){var i=this.getBoundingRect();return i.left>=t.x&&i.left+i.width<=e.x&&i.top>=t.y&&i.top+i.height<=e.y},containsPoint:function(t){this.oCoords||this.setCoords();var e=this._getImageLines(this.oCoords),i=this._findCrossPoints(t,e);return 0!==i&&i%2===1},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s,o,a,h=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){var e=this.calcCoords(t);return fabric.util.makeBoundingBoxFromPoints([e.tl,e.tr,e.br,e.bl])},getWidth:function(){return this._getTransformedDimensions().x},getHeight: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),b=new fabric.Point(p.x-o*a,p.y+o*h),m=new fabric.Point(g.x+u,g.y+f);if(!t)var y=new fabric.Point((p.x+b.x)/2,(p.y+b.y)/2),_=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point((m.x+v.x)/2,(m.y+v.y)/2),C=new fabric.Point((m.x+b.x)/2,(m.y+b.y)/2),S=new fabric.Point(_.x+a*this.rotatingPointOffset,_.y-h*this.rotatingPointOffset);var g={tl:p,tr:v,br:m,bl:b};return t||(g.ml=y,g.mt=_,g.mr=x,g.mb=C,g.mtr=S),g},setCoords:function(t,e){return this.oCoords=this.calcCoords(t),e||t||(this.absoluteCoords=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[i,r,-r,i,0,0]}return[1,0,0,1,0,0]},calcTransformMatrix:function(){var t=this.getCenterPoint(),e=[1,0,0,1,t.x,t.y],r=this._calcRotateMatrix(),n=this._calcDimensionsTransformMatrix(this.skewX,this.skewY,!0),s=this.group?this.group.calcTransformMatrix():[1,0,0,1,0,0];return s=i(s,e),s=i(s,r),s=i(s,n)},_calcDimensionsTransformMatrix:function(t,r,n){var s=[1,0,Math.tan(e(t)),1],o=[1,Math.tan(e(r)),0,1],a=this.scaleX*(n&&this.flipX?-1:1),h=this.scaleY*(n&&this.flipY?-1:1),c=[a,0,0,h],l=i(c,s,!0);return i(l,o,!0)}})}(),fabric.util.object.extend(fabric.Object.prototype,{sendToBack:function(){return this.group?fabric.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?fabric.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(t){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,t):this.canvas.sendBackwards(this,t),this},bringForward:function(t){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,t):this.canvas.bringForward(this,t),this},moveTo:function(t){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,t):this.canvas.moveTo(this,t),this}}),function(){function t(t,e){if(e){if(e.toLive)return t+": url(#SVGID_"+e.id+"); ";var i=new fabric.Color(e),r=t+": "+i.toRgb()+"; ",n=i.getAlpha();return 1!==n&&(r+=t+"-opacity: "+n.toString()+"; "),r}return t+": none; "}fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(e){var i=this.fillRule,r=this.strokeWidth?this.strokeWidth:"0",n=this.strokeDashArray?this.strokeDashArray.join(" "):"none",s=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h="undefined"!=typeof this.opacity?this.opacity:"1",c=this.visible?"":" visibility: hidden;",l=e?"":this.getSvgFilter(),u=t("fill",this.fill),f=t("stroke",this.stroke);return[f,"stroke-width: ",r,"; ","stroke-dasharray: ",n,"; ","stroke-linecap: ",s,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",i,"; ","opacity: ",h,";",l,c].join("")},getSvgFilter:function(){return this.shadow?"filter: url(#SVGID_"+this.shadow.id+");":""},getSvgId:function(){return this.id?'id="'+this.id+'" ':""},getSvgTransform:function(){if(this.group&&"path-group"===this.group.type)return"";var t=fabric.util.toFixed,e=this.getAngle(),i=this.getSkewX()%360,r=this.getSkewY()%360,n=this.getCenterPoint(),s=fabric.Object.NUM_FRACTION_DIGITS,o="path-group"===this.type?"":"translate("+t(n.x,s)+" "+t(n.y,s)+")",a=0!==e?" rotate("+t(e,s)+")":"",h=1===this.scaleX&&1===this.scaleY?"":" scale("+t(this.scaleX,s)+" "+t(this.scaleY,s)+")",c=0!==i?" skewX("+t(i,s)+")":"",l=0!==r?" skewY("+t(r,s)+")":"",u="path-group"===this.type?this.width:0,f=this.flipX?" matrix(-1 0 0 1 "+u+" 0) ":"",d="path-group"===this.type?this.height:0,g=this.flipY?" matrix(1 0 0 -1 0 "+d+")":"";return[o,a,h,f,g,c,l].join("")},getSvgTransformMatrix:function(){return this.transformMatrix?" matrix("+this.transformMatrix.join(" ")+") ":""},_createBaseSVGMarkup:function(){var t=[];return this.fill&&this.fill.toLive&&t.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&t.push(this.stroke.toSVG(this,!1)),this.shadow&&t.push(this.shadow.toSVG(this)),t}})}(),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(!fabric.isLikelyNode&&t instanceof Element)return t===i;if(t instanceof Array){if(t.length!==i.length)return!1;for(var n=0,s=t.length;n\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),i.Line.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),i.Line.fromElement=function(t,e){e=e||{};var n=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),s=[n.x1||0,n.y1||0,n.x2||0,n.y2||0];return e.originX="left",e.originY="top",new i.Line(s,r(n,e))},i.Line.fromObject=function(t,e,r){function s(t){delete t.points,e&&e(t)}var o=n(t,!0);o.points=[t.x1,t.y1,t.x2,t.y2];var a=i.Object._fromObject("Line",o,s,r,"points");return a&&delete a.points,a}}("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)this.group&&"path-group"===this.group.type&&(i=this.left+this.radius,n=this.top+this.radius),e.push("\n');else{var o=Math.cos(this.startAngle)*this.radius,a=Math.sin(this.startAngle)*this.radius,h=Math.cos(this.endAngle)*this.radius,c=Math.sin(this.endAngle)*this.radius,l=s>r?"1":"0";e.push('\n')}return t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.arc(e?this.left+this.radius:0,e?this.top+this.radius:0,this.radius,this.startAngle,this.endAngle,!1),this._renderFill(t),this._renderStroke(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)},complexity:function(){return 1}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r){r||(r={});var s=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(s))throw new Error("value of `r` attribute is required and can not be negative");s.left=s.left||0,s.top=s.top||0;var o=new i.Circle(n(s,r));return o.left-=o.radius,o.top-=o.radius,o},i.Circle.fromObject=function(t,e,r){return i.Object._fromObject("Circle",t,e,r)}}("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("")},complexity:function(){return 1}}),void(e.Triangle.fromObject=function(t,i,r){return e.Object._fromObject("Triangle",t,i,r)}))}("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 this.group&&"path-group"===this.group.type&&(i=this.left+this.rx,r=this.top+this.ry),e.push("\n'),t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(e?this.left+this.rx:0,e?(this.top+this.ry)*this.rx/this.ry:0,this.rx,0,i,!1),t.restore(),this._renderFill(t),this._renderStroke(t)},complexity:function(){return 1}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i){i||(i={});var n=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Ellipse(r(n,i));return s.top-=s.ry,s.left-=s.rx,s},e.Ellipse.fromObject=function(t,i,r){return e.Object._fromObject("Ellipse",t,i,r)}}("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"),e.Rect=e.util.createClass(e.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,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,e){if(1===this.width&&1===this.height)return void t.fillRect(-.5,-.5,1,1);var i=this.rx?Math.min(this.rx,this.width/2):0,r=this.ry?Math.min(this.ry,this.height/2):0,n=this.width,s=this.height,o=e?this.left:-this.width/2,a=e?this.top:-this.height/2,h=0!==i||0!==r,c=.4477152502;t.beginPath(),t.moveTo(o+i,a),t.lineTo(o+n-i,a),h&&t.bezierCurveTo(o+n-c*i,a,o+n,a+c*r,o+n,a+r),t.lineTo(o+n,a+s-r),h&&t.bezierCurveTo(o+n,a+s-c*r,o+n-c*i,a+s,o+n-i,a+s),t.lineTo(o+i,a+s),h&&t.bezierCurveTo(o+c*i,a+s,o,a+s-c*r,o,a+s-r),t.lineTo(o,a+r),h&&t.bezierCurveTo(o,a+c*r,o+c*i,a,o+i,a),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=-this.width/2,r=-this.height/2,n=this.width,s=this.height;t.beginPath(),e.util.drawDashedLine(t,i,r,i+n,r,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r,i+n,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r+s,i,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i,r+s,i,r,this.strokeDashArray),t.closePath()},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.left,r=this.top;return this.group&&"path-group"===this.group.type||(i=-this.width/2,r=-this.height/2),e.push("\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r){if(!t)return null;r=r||{};var n=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Rect(i(r?e.util.object.clone(r):{},n));return s.visible=s.visible&&s.width>0&&s.height>0,s},e.Rect.fromObject=function(t,i,r){return e.Object._fromObject("Rect",t,i,r)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});if(e.Polyline)return void e.warn("fabric.Polyline is already defined");var i=e.Object.prototype.cacheProperties.concat();i.push("points"),e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,minX:0,minY:0,cacheProperties:i,initialize:function(t,i){return e.Polygon.prototype.initialize.call(this,t,i)},_calcDimensions:function(){return e.Polygon.prototype._calcDimensions.call(this)},toObject:function(t){return e.Polygon.prototype.toObject.call(this,t)},toSVG:function(t){return e.Polygon.prototype.toSVG.call(this,t)},_render:function(t,i){e.Polygon.prototype.commonRender.call(this,t,i)&&(this._renderFill(t),this._renderStroke(t))},_renderDashedStroke:function(t){var i,r;t.beginPath();for(var n=0,s=this.points.length;n\n'),t?t(r.join("")):r.join("")},_render:function(t,e){this.commonRender(t,e)&&(this._renderFill(t),(this.stroke||this.strokeDashArray)&&(t.closePath(),this._renderStroke(t)))},commonRender:function(t,e){var i,r=this.points.length,n=e?0:this.pathOffset.x,s=e?0:this.pathOffset.y;if(!r||isNaN(this.points[r-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-n,this.points[0].y-s);for(var o=0;o"},toObject:function(t){var e=n(this.callSuper("toObject",["sourcePath","pathOffset"].concat(t)),{ -path:this.path.map(function(t){return t.slice()})});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 b=1,m=n.length;b\n");for(var s=0,o=e.length;s\n"),t?t(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var t=this.getObjects()[0].get("fill")||"";return"string"==typeof t&&(t=t.toLowerCase(),this.getObjects().every(function(e){var i=e.get("fill")||"";return"string"==typeof i&&i.toLowerCase()===t}))},complexity:function(){return this.paths.reduce(function(t,e){return t+(e&&e.complexity?e.complexity():0)},0)},getObjects:function(){return this.paths}}),e.PathGroup.fromObject=function(t,i){"string"==typeof t.paths?e.loadSVGFromURL(t.paths,function(r){var n=t.paths;delete t.paths;var s=e.util.groupSVGElements(r,t,n);i(s)}):e.util.enlivenObjects(t.paths,function(r){delete t.paths,i(new e.PathGroup(r,t))})},void(e.PathGroup.async=!0))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.array.min,n=e.util.array.max;if(!e.Group){var s={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};e.Group=e.util.createClass(e.Object,e.Collection,{type:"group",strokeWidth:0,subTargetCheck:!1,initialize:function(t,e,i){e=e||{},this._objects=[],i&&this.callSuper("initialize",e),this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},e.originX&&(this.originX=e.originX),e.originY&&(this.originY=e.originY),i?this._updateObjectsCoords(!0):(this._calcBounds(),this._updateObjectsCoords(),this.callSuper("initialize",e)),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(t){for(var e=this.getCenterPoint(),i=this._objects.length;i--;)this._updateObjectCoords(this._objects[i],e,t)},_updateObjectCoords:function(t,e,i){if(t.__origHasControls=t.hasControls,t.hasControls=!1,!i){var r=t.getLeft(),n=t.getTop(),s=!0;t.set({originalLeft:r,originalTop:n,left:r-e.x,top:n-e.y}),t.setCoords(s)}},toString:function(){return"#"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this.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.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)},delegatedProperties:{fill:!0,stroke:!0,strokeWidth:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(t,e){var i=this._objects.length;if(this.delegatedProperties[t]||"canvas"===t)for(;i--;)this._objects[i].set(t,e);else for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){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})},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},drawObject:function(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("")},get:function(t){if(t in s){if(this[t])return this[t];for(var e=0,i=this._objects.length;e\n',"\n"),this.stroke||this.strokeDashArray){var o=this.fill;this.fill=null,e.push("\n'),this.fill=o}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){fabric.util.loadImage(t,function(t){return this.setElement(t,e,i)},this,i&&i.crossOrigin)},toString:function(){return'#'},applyFilters:function(t,e,i,r){if(e=e||this.filters,i=i||this._originalElement){var n,s,o=fabric.util.createImage(),a=this.canvas?this.canvas.getRetinaScaling():fabric.devicePixelRatio,h=this.minimumScaleTrigger/a,c=this;if(0===e.length)return this._element=i,t&&t(this),i;var l=fabric.util.createCanvasElement();return l.width=i.width,l.height=i.height,l.getContext("2d").drawImage(i,0,0,i.width,i.height),e.forEach(function(t){t&&(r?(n=c.scaleX0?90*Math.round((t-1)/90):90*Math.round(t/90)},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(t){t=t||{};var e=function(){},i=t.onComplete||e,r=t.onChange||e,n=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(t){n.setAngle(t),r()},onComplete:function(){n.setCoords(),i()},onStart:function(){n.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(t){return t.straighten(),this.renderAll(),this},fxStraightenObject:function(t){return t.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),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.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.Brightness=n(r.BaseFilter,{type:"Brightness",initialize:function(t){t=t||{},this.brightness=t.brightness||0},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.brightness,s=0,o=r.length;sb||o<0||o>v||(h=4*(a*v+o),c=l[S*d+w],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,n+=p[h+3]*c);y[s]=e,y[s+1]=i,y[s+2]=r,y[s+3]=n+_*(255-n)}u.putImageData(m,0,0)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.GradientTransparency=n(r.BaseFilter,{type:"GradientTransparency",initialize:function(t){t=t||{},this.threshold=t.threshold||100},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.threshold,s=r.length,o=0,a=r.length;o-1?t.channel:0},applyTo:function(t){if(this.mask){var i,r=t.getContext("2d"),n=r.getImageData(0,0,t.width,t.height),s=n.data,o=this.mask.getElement(),a=e.util.createCanvasElement(),h=this.channel,c=n.width*n.height*4;a.width=t.width,a.height=t.height,a.getContext("2d").drawImage(o,0,0,t.width,t.height);var l=a.getContext("2d").getImageData(0,0,t.width,t.height),u=l.data;for(i=0;ic&&i>c&&r>c&&l(e-i)i&&(l=2,f=-1),a>n&&(u=2,d=-1),h=c.getImageData(0,0,i,n),t.width=o(s,i),t.height=o(a,n),c.putImageData(h,0,0);!g||!p;)i=v,n=b,s*ft)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return h(e)*h(i)/e/i}}function f(t){var h,c,u,d,g,k,P,M,A,D,I;for(T.x=(t+.5)*y,j.x=r(T.x),h=0;h=e)){D=r(1e3*s(c-T.x)),O[D]||(O[D]={});for(var E=j.y-w;E<=j.y+w;E++)E<0||E>=o||(I=r(1e3*s(E-T.y)),O[D][I]||(O[D][I]=m(n(i(D*x,2)+i(I*C,2))/1e3)),u=O[D][I],u>0&&(d=4*(E*e+c),g+=u,k+=u*v[d],P+=u*v[d+1],M+=u*v[d+2],A+=u*v[d+3]))}d=4*(h*a+t),b[d]=k/g,b[d+1]=P/g,b[d+2]=M/g,b[d+3]=A/g}return++t1&&L<-1||(x=2*L*L*L-3*L*L+1,x>0&&(E=4*(I+P*e),j+=x*p[E+3],S+=x,p[E+3]<255&&(x=x*p[E+3]/250),w+=x*p[E],O+=x*p[E+1],T+=x*p[E+2],C+=x))}b[_]=w/C,b[_+1]=O/C,b[_+2]=T/C,b[_+3]=j/S}return v},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.ColorMatrix=n(r.BaseFilter,{type:"ColorMatrix",initialize:function(t){t||(t={}),this.matrix=t.matrix||[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]},applyTo:function(t){var e,i,r,n,s,o=t.getContext("2d"),a=o.getImageData(0,0,t.width,t.height),h=a.data,c=h.length,l=this.matrix;for(e=0;e'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=2*Math.ceil(this.fontSize);return t.width+=e,t.height+=e,t},_render:function(t){this._setTextStyles(t),this.group&&"path-group"===this.group.type&&t.translate(this.left,this.top),this._renderTextLinesBackground(t),this._renderText(t),this._renderTextDecoration(t)},_renderText:function(t){this._renderTextFill(t),this._renderTextStroke(t)},_setTextStyles:function(t){t.textBaseline="alphabetic",t.font=this._getFontDeclaration()},_getTextHeight:function(){return this._getHeightOfSingleLine()+(this._textLines.length-1)*this._getHeightOfLine()},_getTextWidth:function(t){for(var e=this._getLineWidth(t,0),i=1,r=this._textLines.length;ie&&(e=n)}return e},_renderChars:function(t,e,i,r,n){var s,o,a=t.slice(0,-4);if(this[a].toLive){var h=-this.width/2+this[a].offsetX||0,c=-this.height/2+this[a].offsetY||0;e.save(),e.translate(h,c),r-=h,n-=c}if(0!==this.charSpacing){var l=this._getWidthOfCharSpacing();i=i.split("");for(var u=0,f=i.length;u0?o:0}else e[t](i,r,n);this[a].toLive&&e.restore()},_renderTextLine:function(t,e,i,r,n,s){n-=this.fontSize*this._fontSizeFraction;var o=this._getLineWidth(e,s);if("justify"!==this.textAlign||this.width0?u/f:0,g=0,p=0,v=h.length;p0?n:0},_getLeftOffset:function(){return-this.width/2},_getTopOffset:function(){return-this.height/2},isEmptyStyles:function(){return!0},_renderTextCommon:function(t,e){for(var i=0,r=this._getLeftOffset(),n=this._getTopOffset(),s=0,o=this._textLines.length;s0&&(r=this._getLineLeftOffset(i),t.fillRect(this._getLeftOffset()+r,this._getTopOffset()+n,i,e/this.lineHeight)),n+=e;t.fillStyle=s,this._removeShadow(t)}},_getLineLeftOffset:function(t){return"center"===this.textAlign?(this.width-t)/2:"right"===this.textAlign?this.width-t:0},_clearCache:function(){this.__lineWidths=[],this.__lineHeights=[]},_shouldClearDimensionCache:function(){var t=this._forceClearCache;return t||(t=this.hasStateChanged("_dimensionAffectingProps")),t&&(this.saveState({propertySet:"_dimensionAffectingProps"}),this.dirty=!0),t},_getLineWidth:function(t,e){if(this.__lineWidths[e])return this.__lineWidths[e]===-1?this.width:this.__lineWidths[e];var i,r,n=this._textLines[e];return i=""===n?0:this._measureLine(t,e),this.__lineWidths[e]=i,i&&"justify"===this.textAlign&&(r=n.split(/\s+/),r.length>1&&(this.__lineWidths[e]=-1)),i},_getWidthOfCharSpacing:function(){return 0!==this.charSpacing?this.fontSize*this.charSpacing/1e3:0},_measureLine:function(t,e){var i,r,n=this._textLines[e],s=t.measureText(n).width,o=0;return 0!==this.charSpacing&&(i=n.split("").length,o=(i-1)*this._getWidthOfCharSpacing()),r=s+o,r>0?r:0},_renderTextDecoration:function(t){function e(e){var n,s,o,a,h,c,l,u=0;for(n=0,s=r._textLines.length;n-1&&n.push(.85),this.textDecoration.indexOf("line-through")>-1&&n.push(.43),this.textDecoration.indexOf("overline")>-1&&n.push(-.12),n.length>0&&e(n)}},_getFontDeclaration:function(){return[e.isLikelyNode?this.fontWeight:this.fontStyle,e.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",e.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(t,e){this.visible&&(this._shouldClearDimensionCache()&&(this._setTextStyles(t),this._initDimensions(t)),this.callSuper("render",t,e))},_splitTextIntoLines:function(){return this.text.split(this._reNewline)},toObject:function(t){var e=["text","fontSize","fontWeight","fontFamily","fontStyle","lineHeight","textDecoration","textAlign","textBackgroundColor","charSpacing"].concat(t);return this.callSuper("toObject",e)},toSVG:function(t){this.ctx||(this.ctx=e.util.createCanvasElement().getContext("2d"));var i=this._createBaseSVGMarkup(),r=this._getSVGLeftTopOffsets(this.ctx),n=this._getSVGTextAndBg(r.textTop,r.textLeft);return this._wrapSVGTextAndBg(i,n),t?t(i.join("")):i.join("")},_getSVGLeftTopOffsets:function(t){var e=this._getHeightOfLine(t,0),i=-this.width/2,r=0;return{textLeft:i+(this.group&&"path-group"===this.group.type?this.left:0),textTop:r+(this.group&&"path-group"===this.group.type?-this.top:0),lineTop:e}},_wrapSVGTextAndBg:function(t,e){var i=!0,r=this.getSvgFilter(),n=""===r?"":' style="'+r+'"';t.push("\t\n",e.textBgRects.join(""),"\t\t\n',e.textSpans.join(""),"\t\t\n","\t\n")},_getSVGTextAndBg:function(t,e){var i=[],r=[],n=0;this._setSVGBg(r);for(var s=0,o=this._textLines.length;s",e.util.string.escapeXml(this._textLines[t]),"\n")},_setSVGTextLineJustifed:function(t,n,s,o){var a=e.util.createCanvasElement().getContext("2d");this._setTextStyles(a);var h,c,l=this._textLines[t],u=l.split(/\s+/),f=this._getWidthOfWords(a,u.join("")),d=this.width-f,g=u.length-1,p=g>0?d/g:0,v=this._getFillAttributes(this.fill);for(o+=this._getLineLeftOffset(this._getLineWidth(a,t)),t=0,c=u.length;t",e.util.string.escapeXml(h),"\n"),o+=this._getWidthOfWords(a,h)+p},_setSVGTextLineBg:function(t,e,n,s,o){t.push("\t\t\n')},_setSVGBg:function(t){this.backgroundColor&&t.push("\t\t\n')},_getFillAttributes:function(t){var i=t&&"string"==typeof t?new e.Color(t):"";return i&&i.getSource()&&1!==i.getAlpha()?'opacity="'+i.getAlpha()+'" fill="'+i.setAlpha(1).toRgb()+'"':'fill="'+t+'"'},_set:function(t,e){this.callSuper("_set",t,e),this._dimensionAffectingProps.indexOf(t)>-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,i){if(!t)return null;var r=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);i=e.util.object.extend(i?e.util.object.clone(i):{},r),i.top=i.top||0,i.left=i.left||0,"dx"in r&&(i.left+=r.dx),"dy"in r&&(i.top+=r.dy),"fontSize"in i||(i.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),i.originX||(i.originX="left");var n="";"textContent"in t?n=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(n=t.firstChild.data),n=n.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var s=new e.Text(n,i),o=s.getHeight()/s.height,a=(s.height+s.strokeWidth)*s.lineHeight-s.height,h=a*o,c=s.getHeight()+h,l=0;return"left"===s.originX&&(l=s.getWidth()/2),"right"===s.originX&&(l=-s.getWidth()/2),s.set({left:s.getLeft()+l,top:s.getTop()-c/2+s.fontSize*(.18+s._fontSizeFraction)/s.lineHeight}),s},e.Text.fromObject=function(t,i,r){return e.Object._fromObject("Text",t,i,r,"text")},e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},_clearCache:function(){this.callSuper("_clearCache"),this.__widthOfSpace=[]},isEmptyStyles:function(){if(!this.styles)return!0;var t=this.styles;for(var e in t)for(var i in t[e])for(var r in t[e][i])return!1;return!0},setSelectionStart:function(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)},_updateAndFire:function(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()},_fireSelectionChanged:function(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})},getSelectionStyles:function(t,e){if(2===arguments.length){for(var i=[],r=t;r0?a:0,lineLeft:r},this.cursorOffsetCache=i,this.cursorOffsetCache},renderCursor:function(t,e){var i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(e,r)):t.leftOffset,a=this.scaleX*this.canvas.getZoom(),h=this.cursorWidth/a;e.fillStyle=this.getCurrentCharColor(r,n),e.globalAlpha=this.__isMousedown?1:this._currentCursorOpacity,e.fillRect(t.left+o-h/2,t.top+t.topOffset,h,s)},renderSelection:function(t,e,i){i.fillStyle=this.selectionColor;for(var r=this.get2DCursorLocation(this.selectionStart),n=this.get2DCursorLocation(this.selectionEnd),s=r.lineIndex,o=n.lineIndex,a=s;a<=o;a++){var h=this._getLineLeftOffset(this._getLineWidth(i,a))||0,c=this._getHeightOfLine(this.ctx,a),l=0,u=0,f=this._textLines[a];if(a===s){for(var d=0,g=f.length;d=r.charIndex&&(a!==o||ds&&a1)&&(c/=this.lineHeight),i.fillRect(e.left+h,e.top+e.topOffset,u>0?u:0,c),e.topOffset+=l}},_renderChars:function(t,e,i,r,n,s,o){if(this.isEmptyStyles())return this._renderCharsFast(t,e,i,r,n);o=o||0;var a,h,c=this._getHeightOfLine(e,s),l="";e.save(),n-=c/this.lineHeight*this._fontSizeFraction;for(var u=o,f=i.length+o;u<=f;u++)a=a||this.getCurrentCharStyle(s,u),h=this.getCurrentCharStyle(s,u+1),(this._hasStyleChanged(a,h)||u===f)&&(this._renderChar(t,e,s,u-1,l,r,n,c),l="",a=h),l+=i[u-o];e.restore()},_renderCharsFast:function(t,e,i,r,n){"fillText"===t&&this.fill&&this.callSuper("_renderChars",t,e,i,r,n),"strokeText"===t&&(this.stroke&&this.strokeWidth>0||this.skipFillStrokeCheck)&&this.callSuper("_renderChars",t,e,i,r,n)},_renderChar:function(t,e,i,r,n,s,o,a){var h,c,l,u,f,d,g,p,v,b=this._getStyleDeclaration(i,r);if(b?(c=this._getHeightOfChar(e,n,i,r),u=b.stroke,l=b.fill,d=b.textDecoration):c=this.fontSize,u=(u||this.stroke)&&"strokeText"===t,l=(l||this.fill)&&"fillText"===t,b&&e.save(),h=this._applyCharStylesGetWidth(e,n,i,r,b||null),d=d||this.textDecoration,b&&b.textBackgroundColor&&this._removeShadow(e),0!==this.charSpacing){p=this._getWidthOfCharSpacing(),g=n.split(""),h=0;for(var m,y=0,_=g.length;y<_;y++)m=g[y],l&&e.fillText(m,s+h,o),u&&e.strokeText(m,s+h,o),v=e.measureText(m).width+p,h+=v>0?v:0}else l&&e.fillText(n,s,o),u&&e.strokeText(n,s,o);(d||""!==d)&&(f=this._fontSizeFraction*a/this.lineHeight,this._renderCharDecoration(e,d,s,o,f,h,c)),b&&e.restore(),e.translate(h,0)},_hasStyleChanged:function(t,e){return t.fill!==e.fill||t.fontSize!==e.fontSize||t.textBackgroundColor!==e.textBackgroundColor||t.textDecoration!==e.textDecoration||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth},_renderCharDecoration:function(t,e,i,r,n,s,o){if(e){var a,h,c=o/15,l={underline:r+o/10,"line-through":r-o*(this._fontSizeFraction+this._fontSizeMult-1)+c,overline:r-(this._fontSizeMult-this._fontSizeFraction)*o},u=["underline","line-through","overline"];for(a=0;a-1&&t.fillRect(i,l[h],s,c)}},_renderTextLine:function(t,e,i,r,n,s){this.isEmptyStyles()||(n+=this.fontSize*(this._fontSizeFraction+.03)),this.callSuper("_renderTextLine",t,e,i,r,n,s)},_renderTextDecoration:function(t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",t)},_renderTextLinesBackground:function(t){this.callSuper("_renderTextLinesBackground",t);var e,i,r,n,s,o,a=0,h=this._getLeftOffset(),c=this._getTopOffset();t.save();for(var l=0,u=this._textLines.length;l0?n:0},_getHeightOfChar:function(t,e,i){var r=this._getStyleDeclaration(e,i);return r&&r.fontSize?r.fontSize:this.fontSize},_getWidthOfCharsAt:function(t,e,i){var r,n,s=0;for(r=0;r0?i:0},_getWidthOfSpace:function(t,e){if(this.__widthOfSpace[e])return this.__widthOfSpace[e];var i=this._textLines[e],r=this._getWidthOfWords(t,i,e,0),n=this.width-r,s=i.length-i.replace(this._reSpacesAndTabs,"").length,o=Math.max(n/s,t.measureText(" ").width);return this.__widthOfSpace[e]=o,o},_getWidthOfWords:function(t,e,i,r){for(var n=0,s=0;sr&&(r=o)}return this.__lineHeights[e]=r*this.lineHeight*this._fontSizeMult,this.__lineHeights[e]},_getTextHeight:function(t){for(var e,i=0,r=0,n=this._textLines.length;r-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this.text.charAt(i)))for(;this._reSpace.test(this.text.charAt(i));)e++,i++;for(;/\S/.test(this.text.charAt(i))&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this.text.charAt(i))&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},_updateTextarea:function(){if(this.hiddenTextarea&&!this.inCompositionMode&&(this.cursorOffsetCache={},this.hiddenTextarea.value=this.text,this.hiddenTextarea.selectionStart=this.selectionStart,this.hiddenTextarea.selectionEnd=this.selectionEnd,this.selectionStart===this.selectionEnd)){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top,this.hiddenTextarea.style.fontSize=t.fontSize}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.text.split(""),e=this._getCursorBoundaries(t,"cursor"),i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(this.ctx,r)):e.leftOffset,a=this.calcTransformMatrix(),h={x:e.left+o,y:e.top+e.topOffset+s},c=this.canvas.upperCanvasEl,l=c.width-s,u=c.height-s;return h=fabric.util.transformPoint(h,a),h=fabric.util.transformPoint(h,this.canvas.viewportTransform),h.x<0&&(h.x=0),h.x>l&&(h.x=l),h.y<0&&(h.y=0),h.y>u&&(h.y=u),h.x+=this.canvas._offset.left,h.y+=this.canvas._offset.top,{left:h.x+"px",top:h.y+"px",fontSize:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.overCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea.blur&&this.hiddenTextarea.blur(),this.hiddenTextarea&&this.canvas&&this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},_removeCharsFromTo:function(t,e){for(;e!==t;)this._removeSingleCharAndStyle(t+1),e--;this.selectionStart=t,this.selectionEnd=t},_removeSingleCharAndStyle:function(t){var e="\n"===this.text[t-1],i=e?t:t-1;this.removeStyleObject(e,i),this.text=this.text.slice(0,t-1)+this.text.slice(t),this._textLines=this._splitTextIntoLines()},insertChars:function(t,e){var i;if(this.selectionEnd-this.selectionStart>1&&this._removeCharsFromTo(this.selectionStart,this.selectionEnd),!e&&this.isEmptyStyles())return void this.insertChar(t,!1);for(var r=0,n=t.length;r=i&&(s[parseInt(o,10)-i]=this.styles[e][o],delete this.styles[e][o]);this.styles[e+1]=s}this._forceClearCache=!0},insertCharStyleObject:function(e,i,r){var n=this.styles[e],s=t(n);0!==i||r||(i=1);for(var o in s){var a=parseInt(o,10);a>=i&&(n[a+1]=s[a],s[a-1]||delete n[a])}this.styles[e][i]=r||t(n[i-1]),this._forceClearCache=!0},insertStyleObjects:function(t,e,i){var r=this.get2DCursorLocation(),n=r.lineIndex,s=r.charIndex;this._getLineStyle(n)||this._setLineStyle(n,{}),"\n"===t?this.insertNewlineStyleObject(n,s,e):this.insertCharStyleObject(n,s,i)},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=i.lineIndex,n=i.charIndex;this._removeStyleObject(t,i,r,n)},_getTextOnPreviousLine:function(t){return this._textLines[t-1]},_removeStyleObject:function(e,i,r,n){if(e){var s=this._getTextOnPreviousLine(i.lineIndex),o=s?s.length:0;this.styles[r-1]||(this.styles[r-1]={});for(n in this.styles[r])this.styles[r-1][parseInt(n,10)+o]=this.styles[r][n];this.shiftLineStyles(i.lineIndex,-1)}else{var a=this.styles[r];a&&delete a[n];var h=t(a);for(var c in h){var l=parseInt(c,10);l>=n&&0!==l&&(a[l-1]=h[l],delete a[l])}}},insertNewline:function(){this.insertChars("\n")},setSelectionStartEndWithShift:function(t,e,i){i<=t?(e===t?this._selectionDirection="left":"right"===this._selectionDirection&&(this._selectionDirection="left",this.selectionEnd=t),this.selectionStart=i):i>t&&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)?(this.fire("tripleclick",t),this._stopEvent(t.e)):this.isDoubleClick(e)&&(this.fire("dblclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y&&this.__lastIsEditing},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}),this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection())}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,this.editable&&!this._isObjectMoved(t.e)&&(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),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=this._textLines.length;hs?0:1,h=r+a;return this.flipX&&(h=n-h),h>this.text.length&&(h=this.text.length),h}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; opacity: 0; width: 0px; height: 0px; z-index: -999;",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.cut.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},_keysMap:{8:"removeChars",9:"exitEditing",27:"exitEditing",13:"insertNewline",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMapUp:{67:"copy",88:"cut"},_ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){if(t.keyCode in this._keysMap)this[this._keysMap[t.keyCode]](t);else{if(!(t.keyCode in this._ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this._ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.renderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone?void(this._copyDone=!1):void(t.keyCode in this._ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this._ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()))},onInput:function(t){if(this.isEditing&&!this.inCompositionMode){var e,i,r,n=this.selectionStart||0,s=this.selectionEnd||0,o=this.text.length,a=this.hiddenTextarea.value.length;a>o?(r="left"===this._selectionDirection?s:n,e=a-o,i=this.hiddenTextarea.value.slice(r,r+e)):(e=a-o+s-n,i=this.hiddenTextarea.value.slice(n,n+e)),this.insertChars(i),t.stopPropagation()}},onCompositionStart:function(){this.inCompositionMode=!0,this.prevCompositionLength=0,this.compositionStart=this.selectionStart},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){var e=t.data;this.selectionStart=this.compositionStart,this.selectionEnd=this.selectionEnd===this.selectionStart?this.compositionStart+this.prevCompositionLength:this.selectionEnd,this.insertChars(e,!1),this.prevCompositionLength=e.length},forwardDelete:function(t){if(this.selectionStart===this.selectionEnd){if(this.selectionStart===this.text.length)return;this.moveCursorRight(t)}this.removeChars(t)},copy:function(t){if(this.selectionStart!==this.selectionEnd){var e=this.getSelectedText(),i=this._getClipboardData(t);i&&i.setData("text",e),fabric.copiedText=e,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),t.stopImmediatePropagation(),t.preventDefault(),this._copyDone=!0}},paste:function(t){var e=null,i=this._getClipboardData(t),r=!0;i?(e=i.getData("text").replace(/\r/g,""),fabric.copiedTextStyle&&fabric.copiedText===e||(r=!1)):e=fabric.copiedText,e&&this.insertChars(e,r),t.stopImmediatePropagation(),t.preventDefault()},cut:function(t){this.selectionStart!==this.selectionEnd&&(this.copy(t),this.removeChars(t))},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},_getWidthBeforeCursor:function(t,e){for(var i,r=this._textLines[t].slice(0,e),n=this._getLineWidth(this.ctx,t),s=this._getLineLeftOffset(n),o=0,a=r.length;oe){i=!0;var f=o-u,d=o,g=Math.abs(f-e),p=Math.abs(d-e);a=p=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.renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(t){if(0!==this.selectionStart)if(t.metaKey){var e=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(e,this.selectionStart),this.setSelectionStart(e)}else if(t.altKey){var i=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(i,this.selectionStart),this.setSelectionStart(i)}else this._removeSingleCharAndStyle(this.selectionStart),this.setSelectionStart(this.selectionStart-1)}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(t,e,i,r,n,s){this._getLineStyle(t)?this._setSVGTextLineChars(t,e,i,r,s):fabric.Text.prototype._setSVGTextLineText.call(this,t,e,i,r,n)},_setSVGTextLineChars:function(t,e,i,r,n){for(var s=this._textLines[t],o=0,a=this._getLineLeftOffset(this._getLineWidth(this.ctx,t))-this.width/2,h=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t),l=0,u=s.length;l\n'].join("")},_createTextCharSpan:function(i,r,n,s,o){var a=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text",getSvgFilter:fabric.Object.prototype.getSvgFilter},r));return['\t\t\t',fabric.util.string.escapeXml(i),"\n"].join("")}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={});e.Textbox=e.util.createClass(e.IText,e.Observable,{type:"textbox",minWidth:20,dynamicMinWidth:2,__cachedLines:null,lockScalingY:!0,lockScalingFlip:!0,noScaleCache:!1,initialize:function(t,i){this.callSuper("initialize",t,i),this.setControlsVisibility(e.Textbox.getTextboxControlVisibility()),this.ctx=this.objectCaching?this._cacheContext:e.util.createCanvasElement().getContext("2d"),this._dimensionAffectingProps.push("width")},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t),this.clearContextTop()),this.dynamicMinWidth=0,this._textLines=this._splitTextIntoLines(t),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this._clearCache(),this.height=this._getTextHeight(t))},_generateStyleMap:function(){for(var t=0,e=0,i=0,r={},n=0;n0?(e=0,i++,t++):" "===this.text[i]&&n>0&&(e++,i++),r[n]={line:t,offset:e},i+=this._textLines[n].length,e+=this._textLines[n].length;return r},_getStyleDeclaration:function(t,e,i){if(this._styleMap){var r=this._styleMap[t];if(!r)return i?{}:null;t=r.line,e=r.offset+e}return this.callSuper("_getStyleDeclaration",t,e,i)},_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=e.split(this._reNewline),n=[];for(i=0;i=this.width&&!d?(n.push(s),s="",r=l,d=!0):r+=g,d||(s+=c),s+=a,u=this._measureText(t,c,i,h),h++,d=!1,l>f&&(f=l);return p&&n.push(s),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f-g),n},_splitTextIntoLines:function(t){t=t||this.ctx;var e=this.textAlign;this._styleMap=null,t.save(),this._setTextStyles(t),this.textAlign="left";var i=this._wrapText(t,this.text);return this.textAlign=e,t.restore(),this._textLines=i,this._styleMap=this._generateStyleMap(),i},setOnGroup:function(t,e){"scaleX"===t&&(this.set("scaleX",Math.abs(1/e)),this.set("width",this.get("width")*e/("undefined"==typeof this.__oldScaleX?1:this.__oldScaleX)),this.__oldScaleX=e)},get2DCursorLocation:function(t){"undefined"==typeof t&&(t=this.selectionStart);for(var e=this._textLines.length,i=0,r=0;r=h.getMinWidth()?(h.set("width",c),!0):void 0},fabric.Group.prototype._refreshControlsVisibility=function(){if("undefined"!=typeof fabric.Textbox)for(var t=this._objects.length;t--;)if(this._objects[t]instanceof fabric.Textbox)return void this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility())};var e=fabric.util.object.clone;fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]},insertCharStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertCharStyleObject.apply(this,[t,e,i])},insertNewlineStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertNewlineStyleObject.apply(this,[t,e,i])},shiftLineStyles:function(t,i){var r=e(this.styles),n=this._styleMap[t];t=n.line;for(var s in this.styles){var o=parseInt(s,10);o>t&&(this.styles[o+i]=r[o],r[o-i]||delete this.styles[o])}},_getTextOnPreviousLine:function(t){for(var e=this._textLines[t-1];this._styleMap[t-2]&&this._styleMap[t-2].line===this._styleMap[t-1].line;)e=this._textLines[t-2]+e,t--;return e},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=this._styleMap[i.lineIndex],n=r.line,s=r.offset+i.charIndex;this._removeStyleObject(t,i,n,s)}})}(),function(){var t=fabric.IText.prototype._getNewSelectionStartFromOffset;fabric.IText.prototype._getNewSelectionStartFromOffset=function(e,i,r,n,s){n=t.call(this,e,i,r,n,s);for(var o=0,a=0,h=0;h=n));h++)"\n"!==this.text[o+a]&&" "!==this.text[o+a]||a++;return n-h+a}}(),function(){function request(t,e,i){var r=URL.parse(t);r.port||(r.port=0===r.protocol.indexOf("https:")?443:80);var n=0===r.protocol.indexOf("https:")?HTTPS:HTTP,s=n.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(t){var r="";e&&t.setEncoding(e),t.on("end",function(){i(r)}),t.on("data",function(e){200===t.statusCode&&(r+=e)})});s.on("error",function(t){t.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(t.message),i(null)}),s.end()}function requestFs(t,e){var i=require("fs");i.readFile(t,function(t,i){if(t)throw fabric.log(t),t;e(i)})}if("undefined"==typeof document||"undefined"==typeof window){var DOMParser=require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(t,e,i){function r(r){r?(n.src=new Buffer(r,"binary"),n._src=t,e&&e.call(i,n)):(n=null,e&&e.call(i,null,!0))}var n=new Image;t&&(t instanceof Buffer||0===t.indexOf("data"))?(n.src=n._src=t,e&&e.call(i,n)):t&&0!==t.indexOf("http")?requestFs(t,r):t?request(t,"binary",r):e&&e.call(i,t)},fabric.loadSVGFromURL=function(t,e,i){t=t.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),0!==t.indexOf("http")?requestFs(t,function(t){fabric.loadSVGFromString(t.toString(),e,i)}):request(t,"",function(t){fabric.loadSVGFromString(t,e,i)})},fabric.loadSVGFromString=function(t,e,i){var r=(new DOMParser).parseFromString(t);fabric.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.createCanvasForNode=function(t,e,i,r){r=r||i;var n=fabric.document.createElement("canvas"),s=new Canvas(t||600,e||600,r),o=new Canvas(t||600,e||600,r);n.style={},n.width=s.width,n.height=s.height,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 +var fabric=fabric||{version:"1.7.4"};"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")),fabric.document.createWindow?fabric.window=fabric.document.createWindow():fabric.window=fabric.document.parentWindow),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode="undefined"!=typeof Buffer&&"undefined"==typeof window,fabric.SHARED_ATTRIBUTES=["display","transform","fill","fill-opacity","fill-rule","opacity","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","id"],fabric.DPI=96,fabric.reNum="(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)",fabric.fontPaths={},fabric.iMatrix=[1,0,0,1,0,0],fabric.charWidthsCache={},fabric.devicePixelRatio=fabric.window.devicePixelRatio||fabric.window.webkitDevicePixelRatio||fabric.window.mozDevicePixelRatio||1,function(){function t(t,e){if(this.__eventListeners[t]){var i=this.__eventListeners[t];e?i[i.indexOf(e)]=!1:fabric.util.array.fill(i,!1)}}function e(t,e){if(this.__eventListeners||(this.__eventListeners={}),1===arguments.length)for(var i in t)this.on(i,t[i]);else this.__eventListeners[t]||(this.__eventListeners[t]=[]),this.__eventListeners[t].push(e);return this}function i(e,i){if(this.__eventListeners){if(0===arguments.length)for(e in this.__eventListeners)t.call(this,e);else if(1===arguments.length&&"object"==typeof arguments[0])for(var r in e)t.call(this,r,e[r]);else t.call(this,e,i);return this}}function r(t,e){if(this.__eventListeners){var i=this.__eventListeners[t];if(i){for(var r=0,n=i.length;r-1},complexity:function(){return this.getObjects().reduce(function(t,e){return t+=e.complexity?e.complexity():0},0)}},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.getContext||"undefined"==typeof G_vmlCanvasManager||G_vmlCanvasManager.initElement(t),t},createImage:function(){return fabric.isLikelyNode?new(require("canvas").Image):fabric.document.createElement("img")},createAccessors:function(t){var e,i,r,n,s,o=t.prototype;for(e=o.stateProperties.length;e--;)i=o.stateProperties[e],r=i.charAt(0).toUpperCase()+i.slice(1),n="set"+r,s="get"+r,o[s]||(o[s]=function(t){return new Function('return this.get("'+t+'")')}(i)),o[n]||(o[n]=function(t){return new Function("value",'return this.set("'+t+'", value)')}(i))},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?D-=2*f:1===c&&D<0&&(D+=2*f);for(var E=Math.ceil(Math.abs(D/f*2)),I=[],L=D/E,F=8/3*Math.sin(L/4)*Math.sin(L/4)/Math.sin(L/2),B=A+L,R=0;R=n?s-n:2*Math.PI-(n-s)}function r(t,e,i,r,n,s,h,c){var l=a.call(arguments);if(o[l])return o[l];var u,f,d,g,p,v,b,m,_=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 O=0;O<2;++O)if(O>0&&(f=6*e-12*r+6*s,u=-3*e+9*r-9*s+3*c,d=3*r-3*e),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>>0;if(0===i)return-1;var r=0;if(arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:0!==r&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r)))),r>=i)return-1;for(var n=r>=0?r:Math.max(i-Math.abs(r),0);n>>0;i>>0;r>>0;i>>0;i>>0;n>>0,r=0;if(arguments.length>1)e=arguments[1];else for(;;){if(r in this){e=this[r++];break}if(++r>=i)throw new TypeError}for(;r/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:t,capitalize:e,escapeXml:i}}(),function(){var t=Array.prototype.slice,e=Function.prototype.apply,i=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var n,s=this,o=t.call(arguments,1);return n=o.length?function(){return e.call(s,this instanceof i?this:r,o.concat(t.call(arguments)))}:function(){return e.call(s,this instanceof i?this:r,arguments)},i.prototype=this.prototype,n.prototype=new i,n})}(),function(){function t(){}function e(t){var e=this.constructor.superclass.prototype[t];return arguments.length>1?e.apply(this,r.call(arguments,1)):e.call(this)}function i(){function i(){this.initialize.apply(this,arguments)}var s=null,a=r.call(arguments,0);"function"==typeof a[0]&&(s=a.shift()),i.superclass=s,i.subclasses=[],s&&(t.prototype=s.prototype,i.prototype=new t,s.subclasses.push(i));for(var h=0,c=a.length;h-1?t.prototype[r]=function(t){return function(){var r=this.constructor.superclass;this.constructor.superclass=i;var n=e[t].apply(this,arguments);if(this.constructor.superclass=r,"initialize"!==t)return n}}(r):t.prototype[r]=e[r],s&&(e.toString!==Object.prototype.toString&&(t.prototype.toString=e.toString),e.valueOf!==Object.prototype.valueOf&&(t.prototype.valueOf=e.valueOf))};fabric.util.createClass=i}(),function(){function t(t){var e,i,r=Array.prototype.slice.call(arguments,1),n=r.length;for(i=0;i-1?s(t,e.match(/opacity:\s*(\d?\.?\d*)/)[1]):t;for(var r in e)if("opacity"===r)s(t,e[r]);else{var n="float"===r||"cssFloat"===r?"undefined"==typeof i.styleFloat?"cssFloat":"styleFloat":r;i[n]=e[r]}return t}var e=fabric.document.createElement("div"),i="string"==typeof e.style.opacity,r="string"==typeof e.style.filter,n=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(t){return t};i?s=function(t,e){return t.style.opacity=e,t}:r&&(s=function(t,e){var i=t.style;return t.currentStyle&&!t.currentStyle.hasLayout&&(i.zoom=1),n.test(i.filter)?(e=e>=.9999?"":"alpha(opacity="+100*e+")",i.filter=i.filter.replace(n,e)):i.filter+=" alpha(opacity="+100*e+")",t}),fabric.util.setStyle=t}(),function(){function t(t){return"string"==typeof t?fabric.document.getElementById(t):t}function e(t,e){var i=fabric.document.createElement(t);for(var r in e)"class"===r?i.className=e[r]:"for"===r?i.htmlFor=e[r]:i.setAttribute(r,e[r]);return i}function i(t,e){t&&(" "+t.className+" ").indexOf(" "+e+" ")===-1&&(t.className+=(t.className?" ":"")+e)}function r(t,i,r){return"string"==typeof i&&(i=e(i,r)),t.parentNode&&t.parentNode.replaceChild(i,t),i.appendChild(t),i}function n(t){for(var e=0,i=0,r=fabric.document.documentElement,n=fabric.document.body||{scrollLeft:0,scrollTop:0};t&&(t.parentNode||t.host)&&(t=t.parentNode||t.host,t===fabric.document?(e=n.scrollLeft||r.scrollLeft||0,i=n.scrollTop||r.scrollTop||0):(e+=t.scrollLeft||0,i+=t.scrollTop||0),1!==t.nodeType||"fixed"!==fabric.util.getElementStyle(t,"position")););return{left:e,top:i}}function s(t){var e,i,r=t&&t.ownerDocument,s={left:0,top:0},o={left:0,top:0},a={borderLeftWidth:"left",borderTopWidth:"top",paddingLeft:"left",paddingTop:"top"};if(!r)return o;for(var h in a)o[a[h]]+=parseInt(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(t){e(function(i){t||(t={});var r,n=i||+new Date,s=t.duration||500,o=n+s,a=t.onChange||function(){},h=t.abort||function(){return!1},c=t.easing||function(t,e,i,r){return-i*Math.cos(t/r*(Math.PI/2))+i+e},l="startValue"in t?t.startValue:0,u="endValue"in t?t.endValue:100,f=t.byValue||u-l;t.onStart&&t.onStart(),function i(u){r=u||+new Date;var d=r>o?s:r-n;return h()?void(t.onComplete&&t.onComplete()):(a(c(d,l,f,s)),r>o?void(t.onComplete&&t.onComplete()):void e(i))}(n)})}function e(){return i.apply(fabric.window,arguments)}var i=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(t){fabric.window.setTimeout(t,1e3/60)};fabric.util.animate=t,fabric.util.requestAnimFrame=e}(),function(){function t(t,e,i){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,b=p.util.object.clone,m=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,O={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"},T={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*$",b=new RegExp(v),m=new RegExp(d,"g");return function(s){var o=n.concat(),a=[];if(!s||s&&!b.test(s))return o;s.replace(m,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 j=new RegExp("^\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*,?\\s*("+p.reNum+"+)\\s*$");p.parseSVGDocument=function(t,e,i){if(t){f(t);var r=p.Object.__uid++,n=d(t),s=p.util.toArray(t.getElementsByTagName("*"));if(n.svgUid=r,0===s.length&&p.isLikelyNode){s=t.selectNodes('//*[name(.)!="svg"]');for(var o=[],a=0,h=s.length;a/i,""))),r&&r.documentElement||e&&e(null),p.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)}t=t.replace(/^\n\s*/,"").trim(),new p.util.request(t,{method:"get",onComplete:r})},loadSVGFromString:function(t,e,i){t=t.trim();var r;if("undefined"!=typeof DOMParser){var n=new DOMParser;n&&n.parseFromString&&(r=n.parseFromString(t,"text/xml"))}else p.window.ActiveXObject&&(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(t.replace(//i,"")));p.parseSVGDocument(r.documentElement,function(t,i){e(t,i)},i)}})}("undefined"!=typeof exports?exports:this),fabric.ElementsParser=function(t,e,i,r){this.elements=t,this.callback=e,this.options=i,this.reviver=r,this.svgUid=i&&i.svgUid||0},fabric.ElementsParser.prototype.parse=function(){this.instances=new Array(this.elements.length),this.numElements=this.elements.length,this.createObjects()},fabric.ElementsParser.prototype.createObjects=function(){for(var t=0,e=this.elements.length;tt.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,i){return"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}fabric.Gradient=fabric.util.createClass({offsetX:0,offsetY:0,initialize:function(t){t||(t={});var e={};this.id=fabric.Object.__uid++,this.type=t.type||"linear",e={x1:t.coords.x1||0,y1:t.coords.y1||0,x2:t.coords.x2||0,y2:t.coords.y2||0},"radial"===this.type&&(e.r1=t.coords.r1||0,e.r2=t.coords.r2||0),this.coords=e,this.colorStops=t.colorStops.slice(),t.gradientTransform&&(this.gradientTransform=t.gradientTransform),this.offsetX=t.offsetX||this.offsetX,this.offsetY=t.offsetY||this.offsetY},addColorStop:function(t){for(var e in t){var i=new fabric.Color(t[e]);this.colorStops.push({offset:e,color:i.toRgb(),opacity:i.getAlpha()})}return this},toObject:function(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=fabric.util.object.clone(this.coords);if(this.colorStops.sort(function(t,e){return t.offset-e.offset}),!t.group||"path-group"!==t.group.type)for(var n in r)"x1"===n||"x2"===n||"r2"===n?r[n]+=this.offsetX-t.width/2:"y1"!==n&&"y2"!==n||(r[n]+=this.offsetY-t.height/2);i='id="SVGID_'+this.id+'" gradientUnits="userSpaceOnUse"',this.gradientTransform&&(i+=' gradientTransform="matrix('+this.gradientTransform.join(" ")+')" '),"linear"===this.type?e=["\n']:"radial"===this.type&&(e=["\n']);for(var s=0;s\n');return e.push("linear"===this.type?"\n":"\n"),e.join("")},toLive:function(t,e){var i,r,n=fabric.util.object.clone(this.coords);if(this.type){if(e.group&&"path-group"===e.group.type)for(r in n)"x1"===r||"x2"===r?n[r]+=-this.offsetX+e.width/2:"y1"!==r&&"y2"!==r||(n[r]+=-this.offsetY+e.height/2);"linear"===this.type?i=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(i=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2));for(var s=0,o=this.colorStops.length;s\n\n\n'},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._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:{},_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()},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(a<0&&(a=360+a),a%=360,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(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}this.targets=[];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){t?this._hoveredTarget!==t&&(this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout")),this.fire("mouse:over",{target:t,e:e}),t.fire("mouseover"),this._hoveredTarget=t):this._hoveredTarget&&(this.fire("mouse:out",{target:this._hoveredTarget,e:e}),this._hoveredTarget.fire("mouseout"),this._hoveredTarget=null)},_checkTarget:function(t,e){if(e&&e.visible&&e.evented&&this.containsPoint(null,e,t)){if(!this.perPixelTargetFind&&!e.perPixelTargetFind||e.isEditing)return!0;var i=this.isTargetTransparent(e,t.x,t.y);if(!i)return!0}},_searchPossibleTargets:function(t,e){for(var i,r,n,s=t.length;s--;)if(this._checkTarget(e,t[s])){i=t[s],"group"===i.type&&i.subTargetCheck&&(r=this._normalizePointer(i,e),n=this._searchPossibleTargets(i._objects,r),n&&this.targets.push(n));break}return i},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._createCanvasElement(),fabric.util.addClass(this.upperCanvasEl,"upper-canvas "+t),this.wrapperEl.appendChild(this.upperCanvasEl),this._copyCanvasStyle(this.lowerCanvasEl,this.upperCanvasEl),this._applyCanvasStyle(this.upperCanvasEl),this.contextTop=this.upperCanvasEl.getContext("2d")},_createCacheCanvas:function(){this.cacheCanvasEl=this._createCanvasElement(),this.cacheCanvasEl.setAttribute("width",this.width),this.cacheCanvasEl.setAttribute("height",this.height),this.contextCache=this.cacheCanvasEl.getContext("2d")},_initWrapperElement:function(){this.wrapperEl=fabric.util.wrapElement(this.lowerCanvasEl,"div",{class:this.containerClass}),fabric.util.setStyle(this.wrapperEl,{width:this.getWidth()+"px",height:this.getHeight()+"px",position:"relative"}),fabric.util.makeElementUnselectable(this.wrapperEl)},_applyCanvasStyle:function(t){var e=this.getWidth()||t.width,i=this.getHeight()||t.height;fabric.util.setStyle(t,{position:"absolute",width:e+"px",height:i+"px",left:0,top:0,"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.renderAll(),this.fire("object:selected",{target:t,e:e}),t.fire("selected",{e:e}),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.renderAll()},_performTransformAction:function(t,e,i){var r=i.x,n=i.y,s=e.target,o=e.action,a=!1;"rotate"===o?(a=this._rotateObject(r,n))&&this._fire("rotating",s,t):"scale"===o?(a=this._onScale(t,e,r,n))&&this._fire("scaling",s,t):"scaleX"===o?(a=this._scaleObject(r,n,"x"))&&this._fire("scaling",s,t):"scaleY"===o?(a=this._scaleObject(r,n,"y"))&&this._fire("scaling",s,t):"skewX"===o?(a=this._skewObject(r,n,"x"))&&this._fire("skewing",s,t):"skewY"===o?(a=this._skewObject(r,n,"y"))&&this._fire("skewing",s,t):(a=this._translateObject(r,n),a&&(this._fire("moving",s,t),this.setCursor(s.moveCursor||this.moveCursor))),e.actionPerformed=e.actionPerformed||a},_fire:function(t,e,i){this.fire("object:"+t,{target:e,e:i}),e.fire(t,{e:i})},_beforeScaleTransform:function(t,e){if("scale"===e.action||"scaleX"===e.action||"scaleY"===e.action){var i=this._shouldCenterTransform(e.target);(i&&("center"!==e.originX||"center"!==e.originY)||!i&&"center"===e.originX&&"center"===e.originY)&&(this._resetCurrentTransform(),e.reset=!0)}},_onScale:function(t,e,i,r){return!t[this.uniScaleKey]&&!this.uniScaleTransform||e.target.get("lockUniScaling")?(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally")):(e.currentAction="scale",this._scaleObject(i,r))},_setCursorFromEvent:function(t,e){if(!e||!e.selectable)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));return n?this._setCornerCursor(n,e,t):this.setCursor(i),!0},_setCornerCursor:function(e,i,r){if(e in t)this.setCursor(this._getRotatedCornerCursor(e,i,r));else{if("mtr"!==e||!i.hasRotatingPoint)return this.setCursor(this.defaultCursor),!1;this.setCursor(this.rotationCursor)}},_getRotatedCornerCursor:function(e,i,r){var n=Math.round(i.getAngle()%360/45);return n<0&&(n+=8),n+=t[e],r[this.altActionKey]&&t[e]%2===0&&(n+=2),n%=8,this.cursorMap[n]}})}(),function(){var t=Math.min,e=Math.max;fabric.util.object.extend(fabric.Canvas.prototype,{_shouldGroup:function(t,e){var i=this.getActiveObject();return t[this.selectionKey]&&e&&e.selectable&&(this.getActiveGroup()||i&&i!==e)&&this.selection},_handleGrouping:function(t,e){var i=this.getActiveGroup();(e!==i||(e=this.findTarget(t,!0)))&&(i?this._updateActiveGroup(e,t):this._createActiveGroup(e,t),this._activeGroup&&this._activeGroup.saveCoords())},_updateActiveGroup:function(t,e){var i=this.getActiveGroup();if(i.contains(t)){if(i.removeWithUpdate(t),t.set("active",!1),1===i.size())return this.discardActiveGroup(e),void this.setActiveObject(i.item(0))}else i.addWithUpdate(t);this.fire("selection:created",{target:i,e:e}),i.set("active",!0)},_createActiveGroup:function(t,e){if(this._activeObject&&t!==this._activeObject){var i=this._createGroup(t);i.addWithUpdate(),this.setActiveGroup(i),this._activeObject=null,this.fire("selection:created",{target:i,e:e})}t.set("active",!0)},_createGroup:function(t){var e=this.getObjects(),i=e.indexOf(this._activeObject)1&&(e=new fabric.Group(e.reverse(),{canvas:this}),e.addWithUpdate(),this.setActiveGroup(e,t),e.saveCoords(),this.fire("selection:created",{target:e}),this.renderAll())},_collectObjects:function(){for(var i,r=[],n=this._groupSelector.ex,s=this._groupSelector.ey,o=n+this._groupSelector.left,a=s+this._groupSelector.top,h=new fabric.Point(t(n,o),t(s,a)),c=new fabric.Point(e(n,o),e(s,a)),l=n===o&&s===a,u=this._objects.length;u--&&(i=this._objects[u],!(i&&i.selectable&&i.visible&&(i.intersectsWithRect(h,c)||i.isContainedWithinRect(h,c)||i.containsPoint(h)||i.containsPoint(c))&&(i.set("active",!0),r.push(i),l))););return r},_maybeGroupObjects:function(t){this.selection&&this._groupSelector&&this._groupSelectedObjects(t);var e=this.getActiveGroup();e&&(e.setObjectsCoords().setCoords(),e.isMoving=!1,this.setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),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.getWidth(),s=this.getHeight(),o=(i.width||this.getWidth())*r,a=(i.height||this.getHeight())*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);this.clear();var n=this;return this._enlivenObjects(r.objects,function(){n._setBgOverlay(r,function(){delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay,n._setOptions(r),e&&e()})},i),this}},_setBgOverlay:function(t,e){var i=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!(t.backgroundImage||t.overlayImage||t.background||t.overlay))return void(e&&e());var n=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(i.renderAll(),e&&e())};this.__setBgOverlay("backgroundImage",t.backgroundImage,r,n),this.__setBgOverlay("overlayImage",t.overlayImage,r,n),this.__setBgOverlay("backgroundColor",t.background,r,n),this.__setBgOverlay("overlayColor",t.overlay,r,n)},__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){var r=this;if(!t||0===t.length)return void(e&&e());var n=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(t,function(t){t.forEach(function(t,e){r.insertAt(t,e)}),r.renderOnAddRemove=n,e&&e()},null,i)},_toDataURL:function(t,e){this.clone(function(i){e(i.toDataURL(t))})},_toDataURLWithMultiplier:function(t,e,i){this.clone(function(r){i(r.toDataURLWithMultiplier(t,e))})},clone:function(t,e){var i=JSON.stringify(this.toJSON(e));this.cloneWithoutData(function(e){e.loadFromJSON(i,function(){t&&t(e)})})},cloneWithoutData:function(t){var e=fabric.document.createElement("canvas");e.width=this.getWidth(),e.height=this.getHeight();var i=new fabric.Canvas(e);i.clipTo=this.clipTo,this.backgroundImage?(i.setBackgroundImage(this.backgroundImage.src,function(){i.renderAll(),t&&t(i)}),i.backgroundImageOpacity=this.backgroundImageOpacity,i.backgroundImageStretch=this.backgroundImageStretch):t&&t(i)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.object.clone,n=e.util.toFixed,s=e.util.string.capitalize,o=e.util.degreesToRadians,a=e.StaticCanvas.supports("setLineDash"),h=!e.isLikelyNode;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:!1,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill fillRule globalCompositeOperation shadow clipTo visible backgroundColor skewX skewY".split(" "),cacheProperties:"fill stroke strokeWidth strokeDashArray width height stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit fillRule backgroundColor".split(" "),initialize:function(t){t=t||{},t&&this.setOptions(t),this.objectCaching&&(this._createCacheCanvas(),this.setupState({propertySet:"cacheProperties"}))},_createCacheCanvas:function(){this._cacheCanvas=e.document.createElement("canvas"),this._cacheContext=this._cacheCanvas.getContext("2d"),this._updateCacheCanvas()},_getCacheCanvasDimensions:function(){var t=this.canvas&&this.canvas.getZoom()||1,i=this.getObjectScaling(),r=this._getNonTransformedDimensions(),n=this.canvas&&this.canvas._isRetinaScaling()?e.devicePixelRatio:1,s=i.scaleX*t*n,o=i.scaleY*t*n,a=r.x*s,h=r.y*o;return{width:Math.ceil(a)+2,height:Math.ceil(h)+2,zoomX:s,zoomY:o}},_updateCacheCanvas:function(){if(this.noScaleCache&&this.canvas&&this.canvas._currentTransform){var t=this.canvas._currentTransform.action;if("scale"===t.slice(0,5))return!1}var e=this._getCacheCanvasDimensions(),i=e.width,r=e.height,n=e.zoomX,s=e.zoomY;return(i!==this.cacheWidth||r!==this.cacheHeight)&&(this._cacheCanvas.width=i,this._cacheCanvas.height=r,this._cacheContext.translate(i/2,r/2),this._cacheContext.scale(n,s),this.cacheWidth=i,this.cacheHeight=r,this.zoomX=n,this.zoomY=s,!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===this.canvas._activeGroup&&this.group.transform(t);var i=e?this._getLeftTopCoords():this.getCenterPoint();t.translate(i.x,i.y),t.rotate(o(this.angle)),t.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1)),t.transform(1,0,Math.tan(o(this.skewX)),1,0,0),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.getAngle(),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}},_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),"width"!==t&&"height"!==t||(this.minScaleLimit=Math.min(.1,1/Math.max(this.width,this.height))),this},setOnGroup:function(){},setSourcePath:function(t){return this.sourcePath=t,this},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:e.iMatrix.concat()},render:function(t,i){0===this.width&&0===this.height||!this.visible||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),i||this.transform(t),this._setOpacity(t),this._setShadow(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.clipTo&&e.util.clipContext(this,t),this.objectCaching&&!this.group?(this.isCacheDirty(i)&&(this.statefullCache&&this.saveState({propertySet:"cacheProperties"}),this.drawObject(this._cacheContext,i),this.dirty=!1),this.drawCacheOnCanvas(t)):(this.drawObject(t,i),i&&this.objectCaching&&this.statefullCache&&this.saveState({propertySet:"cacheProperties"})),this.clipTo&&t.restore(),t.restore())},drawObject:function(t,e){this._renderBackground(t),this._setStrokeStyles(t),this._setFillStyles(t),this._render(t,e)},drawCacheOnCanvas:function(t){t.scale(1/this.zoomX,1/this.zoomY),t.drawImage(this._cacheCanvas,-this.cacheWidth/2,-this.cacheHeight/2)},isCacheDirty:function(t){if(!t&&this._updateCacheCanvas())return!0;if(this.dirty||this.statefullCache&&this.hasStateChanged("cacheProperties")){if(!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){t.globalAlpha*=this.opacity},_setStrokeStyles:function(t){this.stroke&&(t.lineWidth=this.strokeWidth,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,t.strokeStyle=this.stroke.toLive?this.stroke.toLive(t,this):this.stroke)},_setFillStyles:function(t){this.fill&&(t.fillStyle=this.fill.toLive?this.fill.toLive(t,this):this.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),a?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){if(!(!this.active||i||this.group&&this.group!==this.canvas.getActiveGroup())){var r,n=this.getViewportTransform(),s=this.calcTransformMatrix();s=e.util.multiplyTransformMatrices(n,s),r=e.util.qrDecompose(s),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)),this.drawBordersInGroup(t,r)):(t.rotate(o(this.angle)),this.drawBorders(t)),this.drawControls(t),t.restore()}},_setShadow:function(t){if(this.shadow){var i=this.canvas&&this.canvas.viewportTransform[0]||1,r=this.canvas&&this.canvas.viewportTransform[3]||1,n=this.getObjectScaling();this.canvas&&this.canvas._isRetinaScaling()&&(i*=e.devicePixelRatio,r*=e.devicePixelRatio),t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*(i+r)*(n.scaleX+n.scaleY)/4,t.shadowOffsetX=this.shadow.offsetX*i*n.scaleX,t.shadowOffsetY=this.shadow.offsetY*r*n.scaleY}},_removeShadow:function(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)},_applyPatternGradientTransform:function(t,e){if(e.toLive){var i=e.gradientTransform||e.patternTransform;i&&t.transform.apply(t,i);var r=-this.width/2+e.offsetX||0,n=-this.height/2+e.offsetY||0;t.translate(r,n)}},_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())},clone:function(t,i){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(i),t):new e.Object(this.toObject(i))},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.get("active"),left:this.getLeft(),top:this.getTop()};this.set("active",!1),this.setPositionByOrigin(new e.Point(n.getWidth()/2,n.getHeight()/2),"center","center");var o=this.canvas;n.add(this);var a=n.toDataURL(t);return this.set(s).setCoords(),this.canvas=o,n.dispose(),n=null,a},isType:function(t){return this.type===t},complexity:function(){return 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.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,o){var a=e[t];if(i=r(i,!0),!s){var h=o?new a(i[o],i):new a(i);return n&&n(h),h}e.util.enlivenPatterns([i.fill,i.stroke],function(t){i.fill=t[0],i.stroke=t[1];var e=o?new a(i[o],i):new a(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.getWidth(),a=Math.cos(s)*o,h=Math.sin(s)*o;r="string"==typeof this.originX?e[this.originX]:this.originX-.5,n="string"==typeof i?e[i]:i-.5,this.left+=a*(n-r),this.top+=h*(n-r),this.setCoords(),this.originX=i},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var t=this.getCenterPoint();this.originX="center",this.originY="center",this.left=t.x,this.top=t.y},_resetOrigin:function(){var t=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY);this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=t.x, +this.top=t.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","top")}})}(),function(){function t(t){return[new fabric.Point(t.tl.x,t.tl.y),new fabric.Point(t.tr.x,t.tr.y),new fabric.Point(t.br.x,t.br.y),new fabric.Point(t.bl.x,t.bl.y)]}var e=fabric.util.degreesToRadians,i=fabric.util.multiplyTransformMatrices;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,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;return!1},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s,o,a,h=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)},getWidth:function(){return this._getTransformedDimensions().x},getHeight: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),b=new fabric.Point(p.x-o*a,p.y+o*h),m=new fabric.Point(g.x+u,g.y+f);if(!t)var _=new fabric.Point((p.x+b.x)/2,(p.y+b.y)/2),y=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point((m.x+v.x)/2,(m.y+v.y)/2),C=new fabric.Point((m.x+b.x)/2,(m.y+b.y)/2),S=new fabric.Point(y.x+a*this.rotatingPointOffset,y.y-h*this.rotatingPointOffset);var g={tl:p,tr:v,br:m,bl:b};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[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'),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){e=e||{};var n=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),s=[n.x1||0,n.y1||0,n.x2||0,n.y2||0];return e.originX="left",e.originY="top",new i.Line(s,r(n,e))},i.Line.fromObject=function(t,e,r){function s(t){delete t.points,e&&e(t)}var o=n(t,!0);o.points=[t.x1,t.y1,t.x2,t.y2];var a=i.Object._fromObject("Line",o,s,r,"points");return a&&delete a.points,a}}("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)this.group&&"path-group"===this.group.type&&(i=this.left+this.radius,n=this.top+this.radius),e.push("\n');else{var o=Math.cos(this.startAngle)*this.radius,a=Math.sin(this.startAngle)*this.radius,h=Math.cos(this.endAngle)*this.radius,c=Math.sin(this.endAngle)*this.radius,l=s>r?"1":"0";e.push('\n')}return t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.arc(e?this.left+this.radius:0,e?this.top+this.radius:0,this.radius,this.startAngle,this.endAngle,!1),this._renderFill(t),this._renderStroke(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r){r||(r={});var s=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(s))throw new Error("value of `r` attribute is required and can not be negative");s.left=s.left||0,s.top=s.top||0;var o=new i.Circle(n(s,r));return o.left-=o.radius,o.top-=o.radius,o},i.Circle.fromObject=function(t,e,r){return i.Object._fromObject("Circle",t,e,r)}}("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,r){return e.Object._fromObject("Triangle",t,i,r)}))}("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 this.group&&"path-group"===this.group.type&&(i=this.left+this.rx,r=this.top+this.ry),e.push("\n'),t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(e?this.left+this.rx:0,e?(this.top+this.ry)*this.rx/this.ry:0,this.rx,0,i,!1),t.restore(),this._renderFill(t),this._renderStroke(t)}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i){i||(i={});var n=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Ellipse(r(n,i));return s.top-=s.ry,s.left-=s.rx,s},e.Ellipse.fromObject=function(t,i,r){return e.Object._fromObject("Ellipse",t,i,r)}}("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"),e.Rect=e.util.createClass(e.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,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,e){if(1===this.width&&1===this.height)return void t.fillRect(-.5,-.5,1,1);var i=this.rx?Math.min(this.rx,this.width/2):0,r=this.ry?Math.min(this.ry,this.height/2):0,n=this.width,s=this.height,o=e?this.left:-this.width/2,a=e?this.top:-this.height/2,h=0!==i||0!==r,c=.4477152502;t.beginPath(),t.moveTo(o+i,a),t.lineTo(o+n-i,a),h&&t.bezierCurveTo(o+n-c*i,a,o+n,a+c*r,o+n,a+r),t.lineTo(o+n,a+s-r),h&&t.bezierCurveTo(o+n,a+s-c*r,o+n-c*i,a+s,o+n-i,a+s),t.lineTo(o+i,a+s),h&&t.bezierCurveTo(o+c*i,a+s,o,a+s-c*r,o,a+s-r),t.lineTo(o,a+r),h&&t.bezierCurveTo(o,a+c*r,o+c*i,a,o+i,a),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=-this.width/2,r=-this.height/2,n=this.width,s=this.height;t.beginPath(),e.util.drawDashedLine(t,i,r,i+n,r,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r,i+n,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r+s,i,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i,r+s,i,r,this.strokeDashArray),t.closePath()},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.left,r=this.top;return this.group&&"path-group"===this.group.type||(i=-this.width/2,r=-this.height/2),e.push("\n'),t?t(e.join("")):e.join("")}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r){if(!t)return null;r=r||{};var n=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Rect(i(r?e.util.object.clone(r):{},n));return s.visible=s.visible&&s.width>0&&s.height>0,s},e.Rect.fromObject=function(t,i,r){return e.Object._fromObject("Rect",t,i,r)}}("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;if(e.Polyline)return void e.warn("fabric.Polyline is already defined");var o=e.Object.prototype.cacheProperties.concat();o.push("points"),e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,minX:0,minY:0,cacheProperties:o,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=[],r=this._createBaseSVGMarkup(),n=0,o=this.points.length;n\n'),t?t(r.join("")):r.join("")},commonRender:function(t,e){var i,r=this.points.length,n=e?0:this.pathOffset.x,s=e?0:this.pathOffset.y;if(!r||isNaN(this.points[r-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-n,this.points[0].y-s);for(var o=0;o"},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 b=1,m=n.length;b\n");for(var s=0,o=e.length;s\n"),t?t(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var t=this.getObjects()[0].get("fill")||"";return"string"==typeof t&&(t=t.toLowerCase(),this.getObjects().every(function(e){var i=e.get("fill")||"";return"string"==typeof i&&i.toLowerCase()===t}))},complexity:function(){return this.paths.reduce(function(t,e){return t+(e&&e.complexity?e.complexity():0)},0)},getObjects:function(){return this.paths}}),e.PathGroup.fromObject=function(t,i){var r=t.paths;delete t.paths,"string"==typeof orignalPaths?e.loadSVGFromURL(r,function(n){var s=r,o=e.util.groupSVGElements(n,t,s);t.paths=r,i(o)}):e.util.enlivenObjects(r,function(n){var s=new e.PathGroup(n,t);t.paths=r,i(s)})},void(e.PathGroup.async=!0))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.array.min,n=e.util.array.max;if(!e.Group){var s={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};e.Group=e.util.createClass(e.Object,e.Collection,{type:"group",strokeWidth:0,subTargetCheck:!1,initialize:function(t,e,i){e=e||{},this._objects=[],i&&this.callSuper("initialize",e),this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},e.originX&&(this.originX=e.originX),e.originY&&(this.originY=e.originY),i?this._updateObjectsCoords(!0):(this._calcBounds(),this._updateObjectsCoords(),this.callSuper("initialize",e)),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(t){for(var e=this.getCenterPoint(),i=this._objects.length;i--;)this._updateObjectCoords(this._objects[i],e,t)},_updateObjectCoords:function(t,e,i){if(t.__origHasControls=t.hasControls,t.hasControls=!1,!i){var r=t.getLeft(),n=t.getTop(),s=!0,o=!0;t.set({left:r-e.x,top:n-e.y}),t.setCoords(s,o)}},toString:function(){return"#"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this.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.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)},delegatedProperties:{fill:!0,stroke:!0,strokeWidth:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(t,e){var i=this._objects.length;if(this.delegatedProperties[t]||"canvas"===t)for(;i--;)this._objects[i].set(t,e);else for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){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})},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},drawObject:function(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("")},get:function(t){if(t in s){if(this[t])return this[t];for(var e=0,i=this._objects.length;e\n',"\n"),this.stroke||this.strokeDashArray){var o=this.fill;this.fill=null,e.push("\n'),this.fill=o}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){fabric.util.loadImage(t,function(t){return this.setElement(t,e,i)},this,i&&i.crossOrigin)},toString:function(){return'#'},applyFilters:function(t,e,i,r){if(e=e||this.filters,i=i||this._originalElement){var n,s,o=fabric.util.createImage(),a=this.canvas?this.canvas.getRetinaScaling():fabric.devicePixelRatio,h=this.minimumScaleTrigger/a,c=this;if(0===e.length)return this._element=i,t&&t(this),i;var l=fabric.util.createCanvasElement();return l.width=i.width,l.height=i.height,l.getContext("2d").drawImage(i,0,0,i.width,i.height),e.forEach(function(t){t&&(r?(n=c.scaleX0?90*Math.round((t-1)/90):90*Math.round(t/90)},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(t){t=t||{};var e=function(){},i=t.onComplete||e,r=t.onChange||e,n=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(t){n.setAngle(t),r()},onComplete:function(){n.setCoords(),i()},onStart:function(){n.set("active",!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(t){return t.straighten(),this.renderAll(),this},fxStraightenObject:function(t){return t.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters=fabric.Image.filters||{},fabric.Image.filters.BaseFilter=fabric.util.createClass({type:"BaseFilter",initialize:function(t){t&&this.setOptions(t)},setOptions:function(t){for(var e in t)this[e]=t[e]},toObject:function(){return{type:this.type}},toJSON:function(){return this.toObject()}}),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.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.Brightness=n(r.BaseFilter,{type:"Brightness",initialize:function(t){t=t||{},this.brightness=t.brightness||0},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.brightness,s=0,o=r.length;sb||o<0||o>v||(h=4*(a*v+o),c=l[S*d+w],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,n+=p[h+3]*c);_[s]=e,_[s+1]=i,_[s+2]=r,_[s+3]=n+y*(255-n)}u.putImageData(m,0,0)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.GradientTransparency=n(r.BaseFilter,{type:"GradientTransparency",initialize:function(t){t=t||{},this.threshold=t.threshold||100},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.threshold,s=r.length,o=0,a=r.length;o-1?t.channel:0},applyTo:function(t){if(this.mask){var i,r=t.getContext("2d"),n=r.getImageData(0,0,t.width,t.height),s=n.data,o=this.mask.getElement(),a=e.util.createCanvasElement(),h=this.channel,c=n.width*n.height*4;a.width=t.width,a.height=t.height,a.getContext("2d").drawImage(o,0,0,t.width,t.height);var l=a.getContext("2d").getImageData(0,0,t.width,t.height),u=l.data;for(i=0;ic&&i>c&&r>c&&l(e-i)i&&(l=2,f=-1),a>n&&(u=2,d=-1),h=c.getImageData(0,0,i,n),t.width=o(s,i),t.height=o(a,n),c.putImageData(h,0,0);!g||!p;)i=v,n=b,s*ft)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return h(e)*h(i)/e/i}}function f(t){var h,c,u,d,g,k,M,P,A,D,E;for(T.x=(t+.5)*_,j.x=r(T.x),h=0;h=e)){D=r(1e3*s(c-T.x)),O[D]||(O[D]={});for(var I=j.y-w;I<=j.y+w;I++)I<0||I>=o||(E=r(1e3*s(I-T.y)),O[D][E]||(O[D][E]=m(n(i(D*x,2)+i(E*C,2))/1e3)),u=O[D][E],u>0&&(d=4*(I*e+c),g+=u,k+=u*v[d],M+=u*v[d+1],P+=u*v[d+2],A+=u*v[d+3]))}d=4*(h*a+t),b[d]=k/g,b[d+1]=M/g,b[d+2]=P/g,b[d+3]=A/g}return++t1&&L<-1||(x=2*L*L*L-3*L*L+1,x>0&&(I=4*(E+M*e),j+=x*p[I+3],S+=x,p[I+3]<255&&(x=x*p[I+3]/250),w+=x*p[I],O+=x*p[I+1],T+=x*p[I+2],C+=x))}b[y]=w/C,b[y+1]=O/C,b[y+2]=T/C,b[y+3]=j/S}return v},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=e.Image.filters.BaseFilter.fromObject}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.Image.filters,n=e.util.createClass;r.ColorMatrix=n(r.BaseFilter,{type:"ColorMatrix",initialize:function(t){t||(t={}),this.matrix=t.matrix||[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0]},applyTo:function(t){var e,i,r,n,s,o=t.getContext("2d"),a=o.getImageData(0,0,t.width,t.height),h=a.data,c=h.length,l=this.matrix;for(e=0;e'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=2*Math.ceil(this.fontSize);return t.width+=e,t.height+=e,t},_render:function(t){this._setTextStyles(t),this.group&&"path-group"===this.group.type&&t.translate(this.left,this.top),this._renderTextLinesBackground(t),this._renderText(t),this._renderTextDecoration(t)},_renderText:function(t){this._renderTextFill(t),this._renderTextStroke(t)},_setTextStyles:function(t){t.textBaseline="alphabetic",t.font=this._getFontDeclaration()},_getTextHeight:function(){return this._getHeightOfSingleLine()+(this._textLines.length-1)*this._getHeightOfLine()},_getTextWidth:function(t){for(var e=this._getLineWidth(t,0),i=1,r=this._textLines.length;ie&&(e=n)}return e},_renderChars:function(t,e,i,r,n){var s,o,a=t.slice(0,-4);if(this[a].toLive){var h=-this.width/2+this[a].offsetX||0,c=-this.height/2+this[a].offsetY||0;e.save(),e.translate(h,c),r-=h,n-=c}if(0!==this.charSpacing){var l=this._getWidthOfCharSpacing();i=i.split("");for(var u=0,f=i.length;u0?o:0}else e[t](i,r,n);this[a].toLive&&e.restore()},_renderTextLine:function(t,e,i,r,n,s){n-=this.fontSize*this._fontSizeFraction;var o=this._getLineWidth(e,s);if("justify"!==this.textAlign||this.width0?u/f:0,g=0,p=0,v=h.length;p0?n:0},_getLeftOffset:function(){return-this.width/2},_getTopOffset:function(){return-this.height/2},isEmptyStyles:function(){return!0},_renderTextCommon:function(t,e){for(var i=0,r=this._getLeftOffset(),n=this._getTopOffset(),s=0,o=this._textLines.length;s0&&(r=this._getLineLeftOffset(i),t.fillRect(this._getLeftOffset()+r,this._getTopOffset()+n,i,e/this.lineHeight)),n+=e;t.fillStyle=s,this._removeShadow(t)}},_getLineLeftOffset:function(t){return"center"===this.textAlign?(this.width-t)/2:"right"===this.textAlign?this.width-t:0},_clearCache:function(){this.__lineWidths=[],this.__lineHeights=[]},_shouldClearDimensionCache:function(){var t=this._forceClearCache;return t||(t=this.hasStateChanged("_dimensionAffectingProps")),t&&(this.saveState({propertySet:"_dimensionAffectingProps"}),this.dirty=!0),t},_getLineWidth:function(t,e){if(this.__lineWidths[e])return this.__lineWidths[e]===-1?this.width:this.__lineWidths[e];var i,r,n=this._textLines[e];return i=""===n?0:this._measureLine(t,e),this.__lineWidths[e]=i,i&&"justify"===this.textAlign&&(r=n.split(/\s+/),r.length>1&&(this.__lineWidths[e]=-1)),i},_getWidthOfCharSpacing:function(){return 0!==this.charSpacing?this.fontSize*this.charSpacing/1e3:0},_measureLine:function(t,e){var i,r,n=this._textLines[e],s=t.measureText(n).width,o=0;return 0!==this.charSpacing&&(i=n.split("").length,o=(i-1)*this._getWidthOfCharSpacing()),r=s+o,r>0?r:0},_renderTextDecoration:function(t){function e(e){var n,s,o,a,h,c,l,u=0;for(n=0,s=r._textLines.length;n-1&&n.push(.85),this.textDecoration.indexOf("line-through")>-1&&n.push(.43),this.textDecoration.indexOf("overline")>-1&&n.push(-.12),n.length>0&&e(n)}},_getFontDeclaration:function(){return[e.isLikelyNode?this.fontWeight:this.fontStyle,e.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",e.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},render:function(t,e){this.visible&&(this._shouldClearDimensionCache()&&(this._setTextStyles(t),this._initDimensions(t)),this.callSuper("render",t,e))},_splitTextIntoLines:function(){return this.text.split(this._reNewline)},toObject:function(t){var e=["text","fontSize","fontWeight","fontFamily","fontStyle","lineHeight","textDecoration","textAlign","textBackgroundColor","charSpacing"].concat(t);return this.callSuper("toObject",e)},toSVG:function(t){this.ctx||(this.ctx=e.util.createCanvasElement().getContext("2d"));var i=this._createBaseSVGMarkup(),r=this._getSVGLeftTopOffsets(this.ctx),n=this._getSVGTextAndBg(r.textTop,r.textLeft);return this._wrapSVGTextAndBg(i,n),t?t(i.join("")):i.join("")},_getSVGLeftTopOffsets:function(t){var e=this._getHeightOfLine(t,0),i=-this.width/2,r=0;return{textLeft:i+(this.group&&"path-group"===this.group.type?this.left:0),textTop:r+(this.group&&"path-group"===this.group.type?-this.top:0),lineTop:e}},_wrapSVGTextAndBg:function(t,e){var i=!0,r=this.getSvgFilter(),n=""===r?"":' style="'+r+'"';t.push("\t\n",e.textBgRects.join(""),"\t\t\n',e.textSpans.join(""),"\t\t\n","\t\n")},_getSVGTextAndBg:function(t,e){var i=[],r=[],n=0;this._setSVGBg(r);for(var s=0,o=this._textLines.length;s",e.util.string.escapeXml(this._textLines[t]),"\n")},_setSVGTextLineJustifed:function(t,n,s,o){var a=e.util.createCanvasElement().getContext("2d");this._setTextStyles(a);var h,c,l=this._textLines[t],u=l.split(/\s+/),f=this._getWidthOfWords(a,u.join("")),d=this.width-f,g=u.length-1,p=g>0?d/g:0,v=this._getFillAttributes(this.fill);for(o+=this._getLineLeftOffset(this._getLineWidth(a,t)),t=0,c=u.length;t",e.util.string.escapeXml(h),"\n"),o+=this._getWidthOfWords(a,h)+p},_setSVGTextLineBg:function(t,e,n,s,o){t.push("\t\t\n')},_setSVGBg:function(t){this.backgroundColor&&t.push("\t\t\n')},_getFillAttributes:function(t){var i=t&&"string"==typeof t?new e.Color(t):"";return i&&i.getSource()&&1!==i.getAlpha()?'opacity="'+i.getAlpha()+'" fill="'+i.setAlpha(1).toRgb()+'"':'fill="'+t+'"'},_set:function(t,e){this.callSuper("_set",t,e),this._dimensionAffectingProps.indexOf(t)>-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,i){if(!t)return null;var r=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);i=e.util.object.extend(i?e.util.object.clone(i):{},r),i.top=i.top||0,i.left=i.left||0,"dx"in r&&(i.left+=r.dx),"dy"in r&&(i.top+=r.dy),"fontSize"in i||(i.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),i.originX||(i.originX="left");var n="";"textContent"in t?n=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(n=t.firstChild.data),n=n.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var s=new e.Text(n,i),o=s.getHeight()/s.height,a=(s.height+s.strokeWidth)*s.lineHeight-s.height,h=a*o,c=s.getHeight()+h,l=0;return"left"===s.originX&&(l=s.getWidth()/2),"right"===s.originX&&(l=-s.getWidth()/2),s.set({left:s.getLeft()+l,top:s.getTop()-c/2+s.fontSize*(.18+s._fontSizeFraction)/s.lineHeight}),s},e.Text.fromObject=function(t,i,r){return e.Object._fromObject("Text",t,i,r,"text")},e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},_clearCache:function(){this.callSuper("_clearCache"),this.__widthOfSpace=[]},isEmptyStyles:function(){if(!this.styles)return!0;var t=this.styles;for(var e in t)for(var i in t[e])for(var r in t[e][i])return!1;return!0},setSelectionStart:function(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)},_updateAndFire:function(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()},_fireSelectionChanged:function(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})},getSelectionStyles:function(t,e){if(2===arguments.length){for(var i=[],r=t;r0?a:0,lineLeft:r},this.cursorOffsetCache=i,this.cursorOffsetCache},renderCursor:function(t,e){var i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(e,r)):t.leftOffset,a=this.scaleX*this.canvas.getZoom(),h=this.cursorWidth/a;e.fillStyle=this.getCurrentCharColor(r,n),e.globalAlpha=this.__isMousedown?1:this._currentCursorOpacity,e.fillRect(t.left+o-h/2,t.top+t.topOffset,h,s)},renderSelection:function(t,e,i){i.fillStyle=this.selectionColor;for(var r=this.get2DCursorLocation(this.selectionStart),n=this.get2DCursorLocation(this.selectionEnd),s=r.lineIndex,o=n.lineIndex,a=s;a<=o;a++){var h=this._getLineLeftOffset(this._getLineWidth(i,a))||0,c=this._getHeightOfLine(this.ctx,a),l=0,u=0,f=this._textLines[a];if(a===s){for(var d=0,g=f.length;d=r.charIndex&&(a!==o||ds&&a1)&&(c/=this.lineHeight),i.fillRect(e.left+h,e.top+e.topOffset,u>0?u:0,c),e.topOffset+=l}},_renderChars:function(t,e,i,r,n,s,o){if(this.isEmptyStyles())return this._renderCharsFast(t,e,i,r,n);o=o||0;var a,h,c=this._getHeightOfLine(e,s),l="";e.save(),n-=c/this.lineHeight*this._fontSizeFraction;for(var u=o,f=i.length+o;u<=f;u++)a=a||this.getCurrentCharStyle(s,u),h=this.getCurrentCharStyle(s,u+1),(this._hasStyleChanged(a,h)||u===f)&&(this._renderChar(t,e,s,u-1,l,r,n,c),l="",a=h),l+=i[u-o];e.restore()},_renderCharsFast:function(t,e,i,r,n){"fillText"===t&&this.fill&&this.callSuper("_renderChars",t,e,i,r,n),"strokeText"===t&&(this.stroke&&this.strokeWidth>0||this.skipFillStrokeCheck)&&this.callSuper("_renderChars",t,e,i,r,n)},_renderChar:function(t,e,i,r,n,s,o,a){var h,c,l,u,f,d,g,p,v,b=this._getStyleDeclaration(i,r);if(b?(c=this._getHeightOfChar(e,n,i,r),u=b.stroke,l=b.fill,d=b.textDecoration):c=this.fontSize,u=(u||this.stroke)&&"strokeText"===t,l=(l||this.fill)&&"fillText"===t,b&&e.save(),h=this._applyCharStylesGetWidth(e,n,i,r,b||null),d=d||this.textDecoration,b&&b.textBackgroundColor&&this._removeShadow(e),0!==this.charSpacing){p=this._getWidthOfCharSpacing(),g=n.split(""),h=0;for(var m,_=0,y=g.length;_0?v:0}else l&&e.fillText(n,s,o),u&&e.strokeText(n,s,o);(d||""!==d)&&(f=this._fontSizeFraction*a/this.lineHeight,this._renderCharDecoration(e,d,s,o,f,h,c)),b&&e.restore(),e.translate(h,0)},_hasStyleChanged:function(t,e){return t.fill!==e.fill||t.fontSize!==e.fontSize||t.textBackgroundColor!==e.textBackgroundColor||t.textDecoration!==e.textDecoration||t.fontFamily!==e.fontFamily||t.fontWeight!==e.fontWeight||t.fontStyle!==e.fontStyle||t.stroke!==e.stroke||t.strokeWidth!==e.strokeWidth},_renderCharDecoration:function(t,e,i,r,n,s,o){if(e){var a,h,c=o/15,l={underline:r+o/10,"line-through":r-o*(this._fontSizeFraction+this._fontSizeMult-1)+c,overline:r-(this._fontSizeMult-this._fontSizeFraction)*o},u=["underline","line-through","overline"];for(a=0;a-1&&t.fillRect(i,l[h],s,c)}},_renderTextLine:function(t,e,i,r,n,s){this.isEmptyStyles()||(n+=this.fontSize*(this._fontSizeFraction+.03)),this.callSuper("_renderTextLine",t,e,i,r,n,s)},_renderTextDecoration:function(t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",t)},_renderTextLinesBackground:function(t){this.callSuper("_renderTextLinesBackground",t);var e,i,r,n,s,o,a=0,h=this._getLeftOffset(),c=this._getTopOffset();t.save();for(var l=0,u=this._textLines.length;l0?n:0},_getHeightOfChar:function(t,e,i){var r=this._getStyleDeclaration(e,i);return r&&r.fontSize?r.fontSize:this.fontSize},_getWidthOfCharsAt:function(t,e,i){var r,n,s=0;for(r=0;r0?i:0},_getWidthOfSpace:function(t,e){if(this.__widthOfSpace[e])return this.__widthOfSpace[e];var i=this._textLines[e],r=this._getWidthOfWords(t,i,e,0),n=this.width-r,s=i.length-i.replace(this._reSpacesAndTabs,"").length,o=Math.max(n/s,t.measureText(" ").width);return this.__widthOfSpace[e]=o,o},_getWidthOfWords:function(t,e,i,r){for(var n=0,s=0;sr&&(r=o)}return this.__lineHeights[e]=r*this.lineHeight*this._fontSizeMult,this.__lineHeights[e]},_getTextHeight:function(t){for(var e,i=0,r=0,n=this._textLines.length;r-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this.text.charAt(i)))for(;this._reSpace.test(this.text.charAt(i));)e++,i++;for(;/\S/.test(this.text.charAt(i))&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this.text.charAt(i))&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.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},_updateTextarea:function(){if(this.hiddenTextarea&&!this.inCompositionMode&&(this.cursorOffsetCache={},this.hiddenTextarea.value=this.text,this.hiddenTextarea.selectionStart=this.selectionStart,this.hiddenTextarea.selectionEnd=this.selectionEnd,this.selectionStart===this.selectionEnd)){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top,this.hiddenTextarea.style.fontSize=t.fontSize}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.text.split(""),e=this._getCursorBoundaries(t,"cursor"),i=this.get2DCursorLocation(),r=i.lineIndex,n=i.charIndex,s=this.getCurrentCharFontSize(r,n),o=0===r&&0===n?this._getLineLeftOffset(this._getLineWidth(this.ctx,r)):e.leftOffset,a=this.calcTransformMatrix(),h={x:e.left+o,y:e.top+e.topOffset+s},c=this.canvas.upperCanvasEl,l=c.width-s,u=c.height-s;return h=fabric.util.transformPoint(h,a),h=fabric.util.transformPoint(h,this.canvas.viewportTransform),h.x<0&&(h.x=0),h.x>l&&(h.x=l),h.y<0&&(h.y=0),h.y>u&&(h.y=u),h.x+=this.canvas._offset.left,h.y+=this.canvas._offset.top,{left:h.x+"px",top:h.y+"px",fontSize:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.overCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea&&(this.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]},_removeCharsFromTo:function(t,e){for(;e!==t;)this._removeSingleCharAndStyle(t+1),e--;this.selectionStart=t,this.selectionEnd=t},_removeSingleCharAndStyle:function(t){var e="\n"===this.text[t-1],i=e?t:t-1;this.removeStyleObject(e,i),this.text=this.text.slice(0,t-1)+this.text.slice(t),this._textLines=this._splitTextIntoLines()},insertChars:function(t,e){var i;if(this.selectionEnd-this.selectionStart>1&&this._removeCharsFromTo(this.selectionStart,this.selectionEnd),!e&&this.isEmptyStyles())return void this.insertChar(t,!1);for(var r=0,n=t.length;r=i&&(s[parseInt(o,10)-i]=this.styles[e][o],delete this.styles[e][o]);this.styles[e+1]=s}this._forceClearCache=!0},insertCharStyleObject:function(e,i,r){var n=this.styles[e],s=t(n);0!==i||r||(i=1);for(var o in s){var a=parseInt(o,10);a>=i&&(n[a+1]=s[a],s[a-1]||delete n[a])}this.styles[e][i]=r||t(n[i-1]),this._forceClearCache=!0},insertStyleObjects:function(t,e,i){var r=this.get2DCursorLocation(),n=r.lineIndex,s=r.charIndex;this._getLineStyle(n)||this._setLineStyle(n,{}),"\n"===t?this.insertNewlineStyleObject(n,s,e):this.insertCharStyleObject(n,s,i)},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=i.lineIndex,n=i.charIndex;this._removeStyleObject(t,i,r,n)},_getTextOnPreviousLine:function(t){return this._textLines[t-1]},_removeStyleObject:function(e,i,r,n){if(e){var s=this._getTextOnPreviousLine(i.lineIndex),o=s?s.length:0;this.styles[r-1]||(this.styles[r-1]={});for(n in this.styles[r])this.styles[r-1][parseInt(n,10)+o]=this.styles[r][n];this.shiftLineStyles(i.lineIndex,-1)}else{var a=this.styles[r];a&&delete a[n];var h=t(a);for(var c in h){var l=parseInt(c,10);l>=n&&0!==l&&(a[l-1]=h[l],delete a[l])}}},insertNewline:function(){this.insertChars("\n")},setSelectionStartEndWithShift:function(t,e,i){i<=t?(e===t?this._selectionDirection="left":"right"===this._selectionDirection&&(this._selectionDirection="left",this.selectionEnd=t),this.selectionStart=i):i>t&&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)?(this.fire("tripleclick",t),this._stopEvent(t.e)):this.isDoubleClick(e)&&(this.fire("dblclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y&&this.__lastIsEditing},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}),this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection())}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,this.editable&&!this._isObjectMoved(t.e)&&(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),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=this._textLines.length;hs?0:1,h=r+a;return this.flipX&&(h=n-h),h>this.text.length&&(h=this.text.length),h}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; opacity: 0; width: 0px; height: 0px; z-index: -999;",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.cut.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},_keysMap:{8:"removeChars",9:"exitEditing",27:"exitEditing",13:"insertNewline",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMapUp:{67:"copy",88:"cut"},_ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){if(t.keyCode in this._keysMap)this[this._keysMap[t.keyCode]](t);else{if(!(t.keyCode in this._ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this._ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),t.keyCode>=33&&t.keyCode<=40?(this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.renderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone?void(this._copyDone=!1):void(t.keyCode in this._ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this._ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()))},onInput:function(t){if(this.isEditing&&!this.inCompositionMode){var e,i,r,n=this.selectionStart||0,s=this.selectionEnd||0,o=this.text.length,a=this.hiddenTextarea.value.length;a>o?(r="left"===this._selectionDirection?s:n,e=a-o,i=this.hiddenTextarea.value.slice(r,r+e)):(e=a-o+s-n,i=this.hiddenTextarea.value.slice(n,n+e)),this.insertChars(i),t.stopPropagation()}},onCompositionStart:function(){this.inCompositionMode=!0,this.prevCompositionLength=0,this.compositionStart=this.selectionStart},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){var e=t.data;this.selectionStart=this.compositionStart,this.selectionEnd=this.selectionEnd===this.selectionStart?this.compositionStart+this.prevCompositionLength:this.selectionEnd,this.insertChars(e,!1),this.prevCompositionLength=e.length},forwardDelete:function(t){if(this.selectionStart===this.selectionEnd){if(this.selectionStart===this.text.length)return;this.moveCursorRight(t)}this.removeChars(t)},copy:function(t){if(this.selectionStart!==this.selectionEnd){var e=this.getSelectedText(),i=this._getClipboardData(t);i&&i.setData("text",e),fabric.copiedText=e,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),t.stopImmediatePropagation(),t.preventDefault(),this._copyDone=!0}},paste:function(t){var e=null,i=this._getClipboardData(t),r=!0;i?(e=i.getData("text").replace(/\r/g,""),fabric.copiedTextStyle&&fabric.copiedText===e||(r=!1)):e=fabric.copiedText,e&&this.insertChars(e,r),t.stopImmediatePropagation(),t.preventDefault()},cut:function(t){this.selectionStart!==this.selectionEnd&&(this.copy(t),this.removeChars(t))},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},_getWidthBeforeCursor:function(t,e){for(var i,r=this._textLines[t].slice(0,e),n=this._getLineWidth(this.ctx,t),s=this._getLineLeftOffset(n),o=0,a=r.length;oe){i=!0;var f=o-u,d=o,g=Math.abs(f-e),p=Math.abs(d-e);a=p=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.renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(t){if(0!==this.selectionStart)if(t.metaKey){var e=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(e,this.selectionStart),this.setSelectionStart(e)}else if(t.altKey){var i=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(i,this.selectionStart),this.setSelectionStart(i)}else this._removeSingleCharAndStyle(this.selectionStart),this.setSelectionStart(this.selectionStart-1)}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(t,e,i,r,n,s){this._getLineStyle(t)?this._setSVGTextLineChars(t,e,i,r,s):fabric.Text.prototype._setSVGTextLineText.call(this,t,e,i,r,n)},_setSVGTextLineChars:function(t,e,i,r,n){for(var s=this._textLines[t],o=0,a=this._getLineLeftOffset(this._getLineWidth(this.ctx,t))-this.width/2,h=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t),l=0,u=s.length;l\n'].join("")},_createTextCharSpan:function(i,r,n,s,o){var a=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text",getSvgFilter:fabric.Object.prototype.getSvgFilter},r));return['\t\t\t',fabric.util.string.escapeXml(i),"\n"].join("")}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={});e.Textbox=e.util.createClass(e.IText,e.Observable,{type:"textbox",minWidth:20,dynamicMinWidth:2,__cachedLines:null,lockScalingY:!0,lockScalingFlip:!0,noScaleCache:!1,initialize:function(t,i){this.callSuper("initialize",t,i),this.setControlsVisibility(e.Textbox.getTextboxControlVisibility()),this.ctx=this.objectCaching?this._cacheContext:e.util.createCanvasElement().getContext("2d"),this._dimensionAffectingProps.push("width")},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t),this.clearContextTop()),this.dynamicMinWidth=0,this._textLines=this._splitTextIntoLines(t),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this._clearCache(),this.height=this._getTextHeight(t))},_generateStyleMap:function(){for(var t=0,e=0,i=0,r={},n=0;n0?(e=0,i++,t++):" "===this.text[i]&&n>0&&(e++,i++),r[n]={line:t,offset:e},i+=this._textLines[n].length,e+=this._textLines[n].length;return r},_getStyleDeclaration:function(t,e,i){if(this._styleMap){var r=this._styleMap[t];if(!r)return i?{}:null;t=r.line,e=r.offset+e}return this.callSuper("_getStyleDeclaration",t,e,i)},_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=e.split(this._reNewline),n=[];for(i=0;i=this.width&&!d?(n.push(s),s="",r=l,d=!0):r+=g,d||(s+=c),s+=a,u=this._measureText(t,c,i,h),h++,d=!1,l>f&&(f=l);return p&&n.push(s),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f-g),n},_splitTextIntoLines:function(t){t=t||this.ctx;var e=this.textAlign;this._styleMap=null,t.save(),this._setTextStyles(t),this.textAlign="left";var i=this._wrapText(t,this.text);return this.textAlign=e,t.restore(),this._textLines=i,this._styleMap=this._generateStyleMap(),i},setOnGroup:function(t,e){"scaleX"===t&&(this.set("scaleX",Math.abs(1/e)),this.set("width",this.get("width")*e/("undefined"==typeof this.__oldScaleX?1:this.__oldScaleX)),this.__oldScaleX=e)},get2DCursorLocation:function(t){"undefined"==typeof t&&(t=this.selectionStart);for(var e=this._textLines.length,i=0,r=0;r=h.getMinWidth()?(h.set("width",c),!0):void 0},fabric.Group.prototype._refreshControlsVisibility=function(){if("undefined"!=typeof fabric.Textbox)for(var t=this._objects.length;t--;)if(this._objects[t]instanceof fabric.Textbox)return void this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility())};var e=fabric.util.object.clone;fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]},insertCharStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertCharStyleObject.apply(this,[t,e,i])},insertNewlineStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertNewlineStyleObject.apply(this,[t,e,i])},shiftLineStyles:function(t,i){var r=e(this.styles),n=this._styleMap[t];t=n.line;for(var s in this.styles){var o=parseInt(s,10);o>t&&(this.styles[o+i]=r[o],r[o-i]||delete this.styles[o])}},_getTextOnPreviousLine:function(t){for(var e=this._textLines[t-1];this._styleMap[t-2]&&this._styleMap[t-2].line===this._styleMap[t-1].line;)e=this._textLines[t-2]+e,t--;return e},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=this._styleMap[i.lineIndex],n=r.line,s=r.offset+i.charIndex;this._removeStyleObject(t,i,n,s)}})}(),function(){var t=fabric.IText.prototype._getNewSelectionStartFromOffset;fabric.IText.prototype._getNewSelectionStartFromOffset=function(e,i,r,n,s){n=t.call(this,e,i,r,n,s);for(var o=0,a=0,h=0;h=n));h++)"\n"!==this.text[o+a]&&" "!==this.text[o+a]||a++;return n-h+a}}(),function(){function request(t,e,i){var r=URL.parse(t);r.port||(r.port=0===r.protocol.indexOf("https:")?443:80);var n=0===r.protocol.indexOf("https:")?HTTPS:HTTP,s=n.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(t){var r="";e&&t.setEncoding(e),t.on("end",function(){i(r)}),t.on("data",function(e){200===t.statusCode&&(r+=e)})});s.on("error",function(t){t.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(t.message),i(null)}),s.end()}function requestFs(t,e){var i=require("fs");i.readFile(t,function(t,i){if(t)throw fabric.log(t),t;e(i)})}if("undefined"==typeof document||"undefined"==typeof window){var DOMParser=require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(t,e,i){function r(r){r?(n.src=new Buffer(r,"binary"),n._src=t,e&&e.call(i,n)):(n=null,e&&e.call(i,null,!0))}var n=new Image;t&&(t instanceof Buffer||0===t.indexOf("data"))?(n.src=n._src=t,e&&e.call(i,n)):t&&0!==t.indexOf("http")?requestFs(t,r):t?request(t,"binary",r):e&&e.call(i,t)},fabric.loadSVGFromURL=function(t,e,i){t=t.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),0!==t.indexOf("http")?requestFs(t,function(t){fabric.loadSVGFromString(t.toString(),e,i)}):request(t,"",function(t){fabric.loadSVGFromString(t,e,i)})},fabric.loadSVGFromString=function(t,e,i){var r=(new DOMParser).parseFromString(t);fabric.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.createCanvasForNode=function(t,e,i,r){r=r||i;var n=fabric.document.createElement("canvas"),s=new Canvas(t||600,e||600,r),o=new Canvas(t||600,e||600,r);n.style={},n.width=s.width,n.height=s.height,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 3e92aaf9bff64a4a539695a42e1357c1b3b0ede1..9775f8db45b1de83e09b8bc7eea3591a4e704e4c 100644 GIT binary patch literal 69594 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%0AfDN4;So*V3TDqQwWc+W1vYwmc&M)pk@A= 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 G~LfhIx+oDi9@N4^TRa}#7R#8n(b!zz~ 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

s(mQ--qF-<1iqu0 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 diff --git a/dist/fabric.require.js b/dist/fabric.require.js index 4d738f79..8d619cc4 100644 --- a/dist/fabric.require.js +++ b/dist/fabric.require.js @@ -1,5 +1,5 @@ var fabric = fabric || { - version: "1.7.3" + version: "1.7.4" }; if (typeof exports !== "undefined") { @@ -31,6 +31,8 @@ fabric.reNum = "(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:e[-+]?\\d+)?)"; fabric.fontPaths = {}; +fabric.iMatrix = [ 1, 0, 0, 1, 0, 0 ]; + fabric.charWidthsCache = {}; fabric.devicePixelRatio = fabric.window.devicePixelRatio || fabric.window.webkitDevicePixelRatio || fabric.window.mozDevicePixelRatio || 1; @@ -1069,11 +1071,11 @@ 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) { - element.addEventListener(eventName, handler, false); + addListener = function(element, eventName, handler, options) { + element.addEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); }; - removeListener = function(element, eventName, handler) { - element.removeEventListener(eventName, handler, false); + removeListener = function(element, eventName, handler, options) { + element.removeEventListener(eventName, handler, shouldUseAttachEventDetachEvent ? false : options); }; } else if (shouldUseAttachEventDetachEvent) { addListener = function(element, eventName, handler) { @@ -2684,6 +2686,13 @@ fabric.ElementsParser.prototype.checkIfDone = function() { b = b.length === 1 ? "0" + b : b; return r.toUpperCase() + g.toUpperCase() + b.toUpperCase(); }, + toHexa: function() { + var source = this.getSource(), a; + a = source[3] * 255; + a = a.toString(16); + a = a.length === 1 ? "0" + a : a; + return this.toHex() + a.toUpperCase(); + }, getAlpha: function() { return this.getSource()[3]; }, @@ -3202,7 +3211,7 @@ fabric.ElementsParser.prototype.checkIfDone = function() { fabric.warn("fabric.StaticCanvas is already defined."); return; } - var extend = fabric.util.object.extend, getElementOffset = fabric.util.getElementOffset, removeFromArray = fabric.util.removeFromArray, toFixed = fabric.util.toFixed, CANVAS_INIT_ERROR = new Error("Could not initialize `canvas` element"); + var extend = fabric.util.object.extend, getElementOffset = fabric.util.getElementOffset, removeFromArray = fabric.util.removeFromArray, toFixed = fabric.util.toFixed, transformPoint = fabric.util.transformPoint, invertTransform = fabric.util.invertTransform, CANVAS_INIT_ERROR = new Error("Could not initialize `canvas` element"); fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, { initialize: function(el, options) { options || (options = {}); @@ -3219,11 +3228,12 @@ fabric.ElementsParser.prototype.checkIfDone = function() { controlsAboveOverlay: false, allowTouchScrolling: false, imageSmoothingEnabled: true, - viewportTransform: [ 1, 0, 0, 1, 0, 0 ], + viewportTransform: fabric.iMatrix.concat(), backgroundVpt: true, overlayVpt: true, onBeforeScaleRotate: function() {}, enableRetinaScaling: true, + vptCoords: {}, _initStatic: function(el, options) { var cb = fabric.StaticCanvas.prototype.renderAll.bind(this); this._objects = []; @@ -3406,15 +3416,16 @@ fabric.ElementsParser.prototype.checkIfDone = function() { if (activeGroup) { activeGroup.setCoords(ingoreVpt, skipAbsolute); } + this.calcViewportBoundaries(); this.renderAll(); return this; }, zoomToPoint: function(point, value) { var before = point, vpt = this.viewportTransform.slice(0); - point = fabric.util.transformPoint(point, fabric.util.invertTransform(this.viewportTransform)); + point = transformPoint(point, invertTransform(this.viewportTransform)); vpt[0] = value; vpt[3] = value; - var after = fabric.util.transformPoint(point, vpt); + var after = transformPoint(point, vpt); vpt[4] += before.x - after.x; vpt[5] += before.y - after.y; return this.setViewportTransform(vpt); @@ -3465,8 +3476,6 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this.backgroundColor = ""; this.overlayColor = ""; if (this._hasITextHandlers) { - this.off("selection:cleared", this._canvasITextSelectionClearedHanlder); - this.off("object:selected", this._canvasITextSelectionClearedHanlder); this.off("mouse:up", this._mouseUpITextHandler); this._iTextInstances = null; this._hasITextHandlers = false; @@ -3481,7 +3490,23 @@ fabric.ElementsParser.prototype.checkIfDone = function() { this.renderCanvas(canvasToDrawOn, this._objects); return this; }, + calcViewportBoundaries: function() { + var points = {}, width = this.getWidth(), height = this.getHeight(), iVpt = invertTransform(this.viewportTransform); + points.tl = transformPoint({ + x: 0, + y: 0 + }, iVpt); + points.br = transformPoint({ + x: width, + y: height + }, iVpt); + points.tr = new fabric.Point(points.br.x, points.tl.y); + points.bl = new fabric.Point(points.tl.x, points.br.y); + this.vptCoords = points; + return points; + }, renderCanvas: function(ctx, objects) { + this.calcViewportBoundaries(); this.clearContext(ctx); this.fire("before:render"); if (this.clipTo) { @@ -3561,8 +3586,8 @@ fabric.ElementsParser.prototype.checkIfDone = function() { return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y)); }, getVpCenter: function() { - var center = this.getCenter(), iVpt = fabric.util.invertTransform(this.viewportTransform); - return fabric.util.transformPoint({ + var center = this.getCenter(), iVpt = invertTransform(this.viewportTransform); + return transformPoint({ x: center.left, y: center.top }, iVpt); @@ -4647,7 +4672,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { } }, _setLocalMouse: function(localMouse, t) { - var target = t.target; + var target = t.target, zoom = this.getZoom(), padding = target.padding / zoom; if (t.originX === "right") { localMouse.x *= -1; } else if (t.originX === "center") { @@ -4664,20 +4689,20 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { t.mouseYSign = -t.mouseYSign; } } - if (abs(localMouse.x) > target.padding) { + if (abs(localMouse.x) > padding) { if (localMouse.x < 0) { - localMouse.x += target.padding; + localMouse.x += padding; } else { - localMouse.x -= target.padding; + localMouse.x -= padding; } } else { localMouse.x = 0; } - if (abs(localMouse.y) > target.padding) { + if (abs(localMouse.y) > padding) { if (localMouse.y < 0) { - localMouse.y += target.padding; + localMouse.y += padding; } else { - localMouse.y -= target.padding; + localMouse.y -= padding; } } else { localMouse.y = 0; @@ -4747,7 +4772,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { return; } var ignoreZoom = true, pointer = this.getPointer(e, ignoreZoom), activeGroup = this.getActiveGroup(), activeObject = this.getActiveObject(), activeTarget; - if (activeGroup && !skipGroup && this._checkTarget(pointer, activeGroup)) { + if (activeGroup && !skipGroup && activeGroup === this._searchPossibleTargets([ activeGroup ], pointer)) { this._fireOverOutEvents(activeGroup, e); return activeGroup; } @@ -4755,7 +4780,7 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { this._fireOverOutEvents(activeObject, e); return activeObject; } - if (activeObject && this._checkTarget(pointer, activeObject)) { + if (activeObject && activeObject === this._searchPossibleTargets([ activeObject ], pointer)) { if (!this.preserveObjectStacking) { this._fireOverOutEvents(activeObject, e); return activeObject; @@ -4895,7 +4920,8 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { width: width + "px", height: height + "px", left: 0, - top: 0 + top: 0, + "touch-action": "none" }); element.width = width; element.height = height; @@ -4911,13 +4937,23 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { return this.upperCanvasEl; }, _setActiveObject: function(object) { - if (this._activeObject) { - this._activeObject.set("active", false); + 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.renderAll(); this.fire("object:selected", { @@ -4943,27 +4979,36 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { }); obj.fire("deselected"); } + if (this._hoveredTarget === obj) { + this._hoveredTarget = null; + } this.callSuper("_onObjectRemoved", obj); }, _discardActiveObject: function() { - if (this._activeObject) { - this._activeObject.set("active", false); + var obj = this._activeObject; + if (obj) { + obj.set("active", false); + if (obj.onDeselect && typeof obj.onDeselect === "function") { + obj.onDeselect(); + } } this._activeObject = null; }, discardActiveObject: function(e) { var activeObject = this._activeObject; - this.fire("before:selection:cleared", { - target: activeObject, - e: e - }); - this._discardActiveObject(); - this.fire("selection:cleared", { - e: e - }); - activeObject && activeObject.fire("deselected", { - e: e - }); + if (activeObject) { + this.fire("before:selection:cleared", { + target: activeObject, + e: e + }); + this._discardActiveObject(); + this.fire("selection:cleared", { + e: e + }); + activeObject.fire("deselected", { + e: e + }); + } return this; }, _setActiveGroup: function(group) { @@ -4997,14 +5042,16 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { }, discardActiveGroup: function(e) { var g = this.getActiveGroup(); - this.fire("before:selection:cleared", { - e: e, - target: g - }); - this._discardActiveGroup(); - this.fire("selection:cleared", { - e: e - }); + if (g) { + this.fire("before:selection:cleared", { + e: e, + target: g + }); + this._discardActiveGroup(); + this.fire("selection:cleared", { + e: e + }); + } return this; }, deactivateAll: function() { @@ -5018,21 +5065,9 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { return this; }, deactivateAllWithDispatch: function(e) { - var activeGroup = this.getActiveGroup(), activeObject = this.getActiveObject(); - if (activeObject || activeGroup) { - this.fire("before:selection:cleared", { - target: activeObject || activeGroup, - e: e - }); - } + this.discardActiveGroup(e); + this.discardActiveObject(e); this.deactivateAll(); - if (activeObject || activeGroup) { - this.fire("selection:cleared", { - e: e, - target: activeObject - }); - activeObject && activeObject.fire("deselected"); - } return this; }, dispose: function() { @@ -5133,8 +5168,12 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { addListener(this.upperCanvasEl, "mouseenter", this._onMouseEnter); addListener(this.upperCanvasEl, "wheel", this._onMouseWheel); addListener(this.upperCanvasEl, "contextmenu", this._onContextMenu); - addListener(this.upperCanvasEl, "touchstart", this._onMouseDown); - addListener(this.upperCanvasEl, "touchmove", this._onMouseMove); + addListener(this.upperCanvasEl, "touchstart", this._onMouseDown, { + passive: false + }); + addListener(this.upperCanvasEl, "touchmove", this._onMouseMove, { + passive: false + }); if (typeof eventjs !== "undefined" && "add" in eventjs) { eventjs.add(this.upperCanvasEl, "gesture", this._onGesture); eventjs.add(this.upperCanvasEl, "drag", this._onDrag); @@ -5223,8 +5262,12 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { }, _onMouseDown: function(e) { this.__onMouseDown(e); - addListener(fabric.document, "touchend", this._onMouseUp); - addListener(fabric.document, "touchmove", this._onMouseMove); + addListener(fabric.document, "touchend", this._onMouseUp, { + passive: false + }); + addListener(fabric.document, "touchmove", this._onMouseMove, { + passive: false + }); removeListener(this.upperCanvasEl, "mousemove", this._onMouseMove); removeListener(this.upperCanvasEl, "touchmove", this._onMouseMove); if (e.type === "touchstart") { @@ -5241,7 +5284,9 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { removeListener(fabric.document, "mousemove", this._onMouseMove); removeListener(fabric.document, "touchmove", this._onMouseMove); addListener(this.upperCanvasEl, "mousemove", this._onMouseMove); - addListener(this.upperCanvasEl, "touchmove", this._onMouseMove); + addListener(this.upperCanvasEl, "touchmove", this._onMouseMove, { + passive: false + }); if (e.type === "touchend") { var _this = this; setTimeout(function() { @@ -5522,20 +5567,15 @@ fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, { } }, _setCursorFromEvent: function(e, target) { - if (!target) { + if (!target || !target.selectable) { this.setCursor(this.defaultCursor); return false; } - var hoverCursor = target.hoverCursor || this.hoverCursor; - if (!target.selectable) { + var hoverCursor = target.hoverCursor || this.hoverCursor, activeGroup = this.getActiveGroup(), corner = target._findTargetCorner && (!activeGroup || !activeGroup.contains(target)) && target._findTargetCorner(this.getPointer(e, true)); + if (!corner) { this.setCursor(hoverCursor); } else { - var activeGroup = this.getActiveGroup(), corner = target._findTargetCorner && (!activeGroup || !activeGroup.contains(target)) && target._findTargetCorner(this.getPointer(e, true)); - if (!corner) { - this.setCursor(hoverCursor); - } else { - this._setCornerCursor(corner, target, e); - } + this._setCornerCursor(corner, target, e); } return true; }, @@ -6097,7 +6137,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { if (this.canvas && this.canvas.viewportTransform) { return this.canvas.viewportTransform; } - return [ 1, 0, 0, 1, 0, 0 ]; + return fabric.iMatrix.concat(); }, render: function(ctx, noTransform) { if (this.width === 0 && this.height === 0 || !this.visible) { @@ -6151,8 +6191,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { } else { if (this.dirty || this.statefullCache && this.hasStateChanged("cacheProperties")) { if (!skipCanvas) { - var dim = this._getNonTransformedDimensions(); - this._cacheContext.clearRect(-dim.x / 2, -dim.y / 2, dim.x, dim.y); + var width = this.cacheWidth / this.zoomX; + var height = this.cacheHeight / this.zoomY; + this._cacheContext.clearRect(-width / 2, -height / 2, width, height); } return true; } @@ -6329,7 +6370,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return this.type === type; }, complexity: function() { - return 0; + return 1; }, toJSON: function(propertiesToInclude) { return this.toObject(propertiesToInclude); @@ -6567,40 +6608,59 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { })(); (function() { - function getCoords(oCoords) { - return [ new fabric.Point(oCoords.tl.x, oCoords.tl.y), new fabric.Point(oCoords.tr.x, oCoords.tr.y), new fabric.Point(oCoords.br.x, oCoords.br.y), new fabric.Point(oCoords.bl.x, oCoords.bl.y) ]; + function getCoords(coords) { + return [ new fabric.Point(coords.tl.x, coords.tl.y), new fabric.Point(coords.tr.x, coords.tr.y), new fabric.Point(coords.br.x, coords.br.y), new fabric.Point(coords.bl.x, coords.bl.y) ]; } var degreesToRadians = fabric.util.degreesToRadians, multiplyMatrices = fabric.util.multiplyTransformMatrices; fabric.util.object.extend(fabric.Object.prototype, { oCoords: null, - intersectsWithRect: function(pointTL, pointBR) { - var oCoords = getCoords(this.oCoords), intersection = fabric.Intersection.intersectPolygonRectangle(oCoords, pointTL, pointBR); + aCoords: null, + getCoords: function(absolute, calculate) { + if (!this.oCoords) { + this.setCoords(); + } + var coords = absolute ? this.aCoords : this.oCoords; + return getCoords(calculate ? this.calcCoords(absolute) : coords); + }, + intersectsWithRect: function(pointTL, pointBR, absolute, calculate) { + var coords = this.getCoords(absolute, calculate), intersection = fabric.Intersection.intersectPolygonRectangle(coords, pointTL, pointBR); return intersection.status === "Intersection"; }, - intersectsWithObject: function(other) { - var intersection = fabric.Intersection.intersectPolygonPolygon(getCoords(this.oCoords), getCoords(other.oCoords)); - return intersection.status === "Intersection" || other.isContainedWithinObject(this) || this.isContainedWithinObject(other); + intersectsWithObject: function(other, absolute, calculate) { + var intersection = fabric.Intersection.intersectPolygonPolygon(this.getCoords(absolute, calculate), other.getCoords(absolute, calculate)); + return intersection.status === "Intersection" || other.isContainedWithinObject(this, absolute, calculate) || this.isContainedWithinObject(other, absolute, calculate); }, - isContainedWithinObject: function(other) { - var points = getCoords(this.oCoords), i = 0; + isContainedWithinObject: function(other, absolute, calculate) { + var points = this.getCoords(absolute, calculate), i = 0, lines = other._getImageLines(calculate ? other.calcCoords(absolute) : absolute ? other.aCoords : other.oCoords); for (;i < 4; i++) { - if (!other.containsPoint(points[i])) { + if (!other.containsPoint(points[i], lines)) { return false; } } return true; }, - isContainedWithinRect: function(pointTL, pointBR) { - var boundingRect = this.getBoundingRect(); + isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) { + var boundingRect = this.getBoundingRect(absolute, calculate); return boundingRect.left >= pointTL.x && boundingRect.left + boundingRect.width <= pointBR.x && boundingRect.top >= pointTL.y && boundingRect.top + boundingRect.height <= pointBR.y; }, - containsPoint: function(point) { - if (!this.oCoords) { - this.setCoords(); - } - var lines = this._getImageLines(this.oCoords), xPoints = this._findCrossPoints(point, lines); + containsPoint: function(point, lines, absolute, calculate) { + var lines = lines || this._getImageLines(calculate ? this.calcCoords(absolute) : absolute ? this.aCoords : this.oCoords), xPoints = this._findCrossPoints(point, lines); return xPoints !== 0 && xPoints % 2 === 1; }, + isOnScreen: function(calculate) { + if (!this.canvas) { + return false; + } + var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; + var points = this.getCoords(true, calculate), point; + for (var i = 0; i < 4; i++) { + point = points[i]; + if (point.x <= pointBR.x && point.x >= pointTL.x && point.y <= pointBR.y && point.y >= pointTL.y) { + return true; + } + } + return false; + }, _getImageLines: function(oCoords) { return { topline: { @@ -6621,10 +6681,10 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { } }; }, - _findCrossPoints: function(point, oCoords) { + _findCrossPoints: function(point, lines) { var b1, b2, a1, a2, xi, xcount = 0, iLine; - for (var lineKey in oCoords) { - iLine = oCoords[lineKey]; + for (var lineKey in lines) { + iLine = lines[lineKey]; if (iLine.o.y < point.y && iLine.d.y < point.y) { continue; } @@ -6655,9 +6715,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { getBoundingRectHeight: function() { return this.getBoundingRect().height; }, - getBoundingRect: function(ignoreVpt) { - var coords = this.calcCoords(ignoreVpt); - return fabric.util.makeBoundingBoxFromPoints([ coords.tl, coords.tr, coords.br, coords.bl ]); + getBoundingRect: function(absolute, calculate) { + var coords = this.getCoords(absolute, calculate); + return fabric.util.makeBoundingBoxFromPoints(coords); }, getWidth: function() { return this._getTransformedDimensions().x; @@ -6694,9 +6754,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var boundingRectFactor = this.getBoundingRect().height / this.getHeight(); return this.scale(value / this.height / boundingRectFactor); }, - calcCoords: function(ignoreVpt) { - var theta = degreesToRadians(this.angle), vpt = this.getViewportTransform(), dim = ignoreVpt ? this._getTransformedDimensions() : this._calculateCurrentDimensions(), currentWidth = dim.x, currentHeight = dim.y, sinTh = Math.sin(theta), cosTh = Math.cos(theta), _angle = currentWidth > 0 ? Math.atan(currentHeight / currentWidth) : 0, _hypotenuse = currentWidth / Math.cos(_angle) / 2, offsetX = Math.cos(_angle + theta) * _hypotenuse, offsetY = Math.sin(_angle + theta) * _hypotenuse, center = this.getCenterPoint(), coords = ignoreVpt ? center : fabric.util.transformPoint(center, vpt), tl = new fabric.Point(coords.x - offsetX, coords.y - offsetY), tr = new fabric.Point(tl.x + currentWidth * cosTh, tl.y + currentWidth * sinTh), bl = new fabric.Point(tl.x - currentHeight * sinTh, tl.y + currentHeight * cosTh), br = new fabric.Point(coords.x + offsetX, coords.y + offsetY); - if (!ignoreVpt) { + calcCoords: function(absolute) { + var theta = degreesToRadians(this.angle), vpt = this.getViewportTransform(), dim = absolute ? this._getTransformedDimensions() : this._calculateCurrentDimensions(), currentWidth = dim.x, currentHeight = dim.y, sinTh = Math.sin(theta), cosTh = Math.cos(theta), _angle = currentWidth > 0 ? Math.atan(currentHeight / currentWidth) : 0, _hypotenuse = currentWidth / Math.cos(_angle) / 2, offsetX = Math.cos(_angle + theta) * _hypotenuse, offsetY = Math.sin(_angle + theta) * _hypotenuse, center = this.getCenterPoint(), coords = absolute ? center : fabric.util.transformPoint(center, vpt), tl = new fabric.Point(coords.x - offsetX, coords.y - offsetY), tr = new fabric.Point(tl.x + currentWidth * cosTh, tl.y + currentWidth * sinTh), bl = new fabric.Point(tl.x - currentHeight * sinTh, tl.y + currentHeight * cosTh), br = new fabric.Point(coords.x + offsetX, coords.y + offsetY); + if (!absolute) { var ml = new fabric.Point((tl.x + bl.x) / 2, (tl.y + bl.y) / 2), mt = new fabric.Point((tr.x + tl.x) / 2, (tr.y + tl.y) / 2), mr = new fabric.Point((br.x + tr.x) / 2, (br.y + tr.y) / 2), mb = new fabric.Point((br.x + bl.x) / 2, (br.y + bl.y) / 2), mtr = new fabric.Point(mt.x + sinTh * this.rotatingPointOffset, mt.y - cosTh * this.rotatingPointOffset); } var coords = { @@ -6705,7 +6765,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { br: br, bl: bl }; - if (!ignoreVpt) { + if (!absolute) { coords.ml = ml; coords.mt = mt; coords.mr = mr; @@ -6716,8 +6776,8 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { }, setCoords: function(ignoreZoom, skipAbsolute) { this.oCoords = this.calcCoords(ignoreZoom); - if (!skipAbsolute && !ignoreZoom) { - this.absoluteCoords = this.calcCoords(true); + if (!skipAbsolute) { + this.aCoords = this.calcCoords(true); } ignoreZoom || this._setCornerCoords && this._setCornerCoords(); return this; @@ -6727,10 +6787,10 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var theta = degreesToRadians(this.angle), cos = Math.cos(theta), sin = Math.sin(theta); return [ cos, sin, -sin, cos, 0, 0 ]; } - return [ 1, 0, 0, 1, 0, 0 ]; + return fabric.iMatrix.concat(); }, - calcTransformMatrix: function() { - 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 ? this.group.calcTransformMatrix() : [ 1, 0, 0, 1, 0, 0 ]; + 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); matrix = multiplyMatrices(matrix, dimensionMatrix); @@ -6739,6 +6799,46 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { _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); + }, + _getNonTransformedDimensions: function() { + var strokeWidth = this.strokeWidth, w = this.width + strokeWidth, h = this.height + strokeWidth; + return { + x: w, + y: h + }; + }, + _getTransformedDimensions: function(skewX, skewY) { + if (typeof skewX === "undefined") { + skewX = this.skewX; + } + if (typeof skewY === "undefined") { + skewY = this.skewY; + } + var dimensions = this._getNonTransformedDimensions(), dimX = dimensions.x / 2, dimY = dimensions.y / 2, points = [ { + x: -dimX, + y: -dimY + }, { + x: dimX, + y: -dimY + }, { + x: -dimX, + y: dimY + }, { + x: dimX, + y: dimY + } ], i, transformMatrix = this._calcDimensionsTransformMatrix(skewX, skewY, false), bbox; + for (i = 0; i < points.length; i++) { + points[i] = fabric.util.transformPoint(points[i], transformMatrix); + } + bbox = fabric.util.makeBoundingBoxFromPoints(points); + return { + x: bbox.width, + y: bbox.height + }; + }, + _calculateCurrentDimensions: function() { + var vpt = this.getViewportTransform(), dim = this._getTransformedDimensions(), p = fabric.util.transformPoint(dim, vpt, true); + return p.scalarAdd(2 * this.padding); } }); })(); @@ -6960,46 +7060,6 @@ fabric.util.object.extend(fabric.Object.prototype, { }; } }, - _getNonTransformedDimensions: function() { - var strokeWidth = this.strokeWidth, w = this.width + strokeWidth, h = this.height + strokeWidth; - return { - x: w, - y: h - }; - }, - _getTransformedDimensions: function(skewX, skewY) { - if (typeof skewX === "undefined") { - skewX = this.skewX; - } - if (typeof skewY === "undefined") { - skewY = this.skewY; - } - var dimensions = this._getNonTransformedDimensions(), dimX = dimensions.x / 2, dimY = dimensions.y / 2, points = [ { - x: -dimX, - y: -dimY - }, { - x: dimX, - y: -dimY - }, { - x: -dimX, - y: dimY - }, { - x: dimX, - y: dimY - } ], i, transformMatrix = this._calcDimensionsTransformMatrix(skewX, skewY, false), bbox; - for (i = 0; i < points.length; i++) { - points[i] = fabric.util.transformPoint(points[i], transformMatrix); - } - bbox = fabric.util.makeBoundingBoxFromPoints(points); - return { - x: bbox.width, - y: bbox.height - }; - }, - _calculateCurrentDimensions: function() { - var vpt = this.getViewportTransform(), dim = this._getTransformedDimensions(), p = fabric.util.transformPoint(dim, vpt, true); - return p.scalarAdd(2 * this.padding); - }, drawSelectionBackground: function(ctx) { if (!this.selectionBackgroundColor || this.group || !this.active) { return this; @@ -7386,9 +7446,6 @@ fabric.util.object.extend(fabric.Object.prototype, { } markup.push("\n'); return reviver ? reviver(markup.join("")) : markup.join(""); - }, - complexity: function() { - return 1; } }); fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")); @@ -7487,9 +7544,6 @@ fabric.util.object.extend(fabric.Object.prototype, { setRadius: function(value) { this.radius = value; return this.set("width", value * 2).set("height", value * 2); - }, - complexity: function() { - return 1; } }); fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")); @@ -7549,9 +7603,6 @@ fabric.util.object.extend(fabric.Object.prototype, { var markup = this._createBaseSVGMarkup(), widthBy2 = this.width / 2, heightBy2 = this.height / 2, points = [ -widthBy2 + " " + heightBy2, "0 " + -heightBy2, widthBy2 + " " + heightBy2 ].join(","); markup.push("'); return reviver ? reviver(markup.join("")) : markup.join(""); - }, - complexity: function() { - return 1; } }); fabric.Triangle.fromObject = function(object, callback, forceAsync) { @@ -7619,9 +7670,6 @@ fabric.util.object.extend(fabric.Object.prototype, { ctx.restore(); this._renderFill(ctx); this._renderStroke(ctx); - }, - complexity: function() { - return 1; } }); fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")); @@ -7706,9 +7754,6 @@ fabric.util.object.extend(fabric.Object.prototype, { } markup.push("\n'); return reviver ? reviver(markup.join("")) : markup.join(""); - }, - complexity: function() { - return 1; } }); fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")); @@ -7731,7 +7776,7 @@ fabric.util.object.extend(fabric.Object.prototype, { (function(global) { "use strict"; - var fabric = global.fabric || (global.fabric = {}); + var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, min = fabric.util.array.min, max = fabric.util.array.max, toFixed = fabric.util.toFixed; if (fabric.Polyline) { fabric.warn("fabric.Polyline is already defined"); return; @@ -7744,67 +7789,6 @@ fabric.util.object.extend(fabric.Object.prototype, { minX: 0, minY: 0, cacheProperties: cacheProperties, - initialize: function(points, options) { - return fabric.Polygon.prototype.initialize.call(this, points, options); - }, - _calcDimensions: function() { - return fabric.Polygon.prototype._calcDimensions.call(this); - }, - toObject: function(propertiesToInclude) { - return fabric.Polygon.prototype.toObject.call(this, propertiesToInclude); - }, - toSVG: function(reviver) { - return fabric.Polygon.prototype.toSVG.call(this, reviver); - }, - _render: function(ctx, noTransform) { - if (!fabric.Polygon.prototype.commonRender.call(this, ctx, noTransform)) { - return; - } - this._renderFill(ctx); - this._renderStroke(ctx); - }, - _renderDashedStroke: function(ctx) { - var p1, p2; - ctx.beginPath(); - for (var i = 0, len = this.points.length; i < len; i++) { - p1 = this.points[i]; - p2 = this.points[i + 1] || p1; - fabric.util.drawDashedLine(ctx, p1.x, p1.y, p2.x, p2.y, this.strokeDashArray); - } - }, - complexity: function() { - return this.get("points").length; - } - }); - fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); - fabric.Polyline.fromElement = function(element, options) { - if (!element) { - return null; - } - options || (options = {}); - var points = fabric.parsePointsAttribute(element.getAttribute("points")), parsedAttributes = fabric.parseAttributes(element, fabric.Polyline.ATTRIBUTE_NAMES); - return new fabric.Polyline(points, fabric.util.object.extend(parsedAttributes, options)); - }; - fabric.Polyline.fromObject = function(object, callback, forceAsync) { - return fabric.Object._fromObject("Polyline", object, callback, forceAsync, "points"); - }; -})(typeof exports !== "undefined" ? exports : this); - -(function(global) { - "use strict"; - var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend, min = fabric.util.array.min, max = fabric.util.array.max, toFixed = fabric.util.toFixed; - if (fabric.Polygon) { - fabric.warn("fabric.Polygon is already defined"); - return; - } - var cacheProperties = fabric.Object.prototype.cacheProperties.concat(); - cacheProperties.push("points"); - fabric.Polygon = fabric.util.createClass(fabric.Object, { - type: "polygon", - points: null, - minX: 0, - minY: 0, - cacheProperties: cacheProperties, initialize: function(points, options) { options = options || {}; this.points = points || []; @@ -7844,16 +7828,6 @@ fabric.util.object.extend(fabric.Object.prototype, { markup.push("<", this.type, " ", this.getSvgId(), 'points="', points.join(""), '" style="', this.getSvgStyles(), '" transform="', this.getSvgTransform(), addTransform, " ", this.getSvgTransformMatrix(), '"/>\n'); return reviver ? reviver(markup.join("")) : markup.join(""); }, - _render: function(ctx, noTransform) { - if (!this.commonRender(ctx, noTransform)) { - return; - } - this._renderFill(ctx); - if (this.stroke || this.strokeDashArray) { - ctx.closePath(); - this._renderStroke(ctx); - } - }, commonRender: function(ctx, noTransform) { var point, len = this.points.length, x = noTransform ? 0 : this.pathOffset.x, y = noTransform ? 0 : this.pathOffset.y; if (!len || isNaN(this.points[len - 1].y)) { @@ -7867,12 +7841,60 @@ fabric.util.object.extend(fabric.Object.prototype, { } return true; }, + _render: function(ctx, noTransform) { + if (!this.commonRender(ctx, noTransform)) { + return; + } + this._renderFill(ctx); + this._renderStroke(ctx); + }, _renderDashedStroke: function(ctx) { - fabric.Polyline.prototype._renderDashedStroke.call(this, ctx); - ctx.closePath(); + var p1, p2; + ctx.beginPath(); + for (var i = 0, len = this.points.length; i < len; i++) { + p1 = this.points[i]; + p2 = this.points[i + 1] || p1; + fabric.util.drawDashedLine(ctx, p1.x, p1.y, p2.x, p2.y, this.strokeDashArray); + } }, complexity: function() { - return this.points.length; + return this.get("points").length; + } + }); + fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); + fabric.Polyline.fromElement = function(element, options) { + if (!element) { + return null; + } + options || (options = {}); + var points = fabric.parsePointsAttribute(element.getAttribute("points")), parsedAttributes = fabric.parseAttributes(element, fabric.Polyline.ATTRIBUTE_NAMES); + return new fabric.Polyline(points, fabric.util.object.extend(parsedAttributes, options)); + }; + fabric.Polyline.fromObject = function(object, callback, forceAsync) { + return fabric.Object._fromObject("Polyline", object, callback, forceAsync, "points"); + }; +})(typeof exports !== "undefined" ? exports : this); + +(function(global) { + "use strict"; + var fabric = global.fabric || (global.fabric = {}), extend = fabric.util.object.extend; + if (fabric.Polygon) { + fabric.warn("fabric.Polygon is already defined"); + return; + } + fabric.Polygon = fabric.util.createClass(fabric.Polyline, { + type: "polygon", + _render: function(ctx, noTransform) { + if (!this.commonRender(ctx, noTransform)) { + return; + } + ctx.closePath(); + this._renderFill(ctx); + this._renderStroke(ctx); + }, + _renderDashedStroke: function(ctx) { + this.callSuper("_renderDashedStroke", ctx); + ctx.closePath(); } }); fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); @@ -8155,7 +8177,9 @@ fabric.util.object.extend(fabric.Object.prototype, { var o = extend(this.callSuper("toObject", [ "sourcePath", "pathOffset" ].concat(propertiesToInclude)), { path: this.path.map(function(item) { return item.slice(); - }) + }), + top: this.top, + left: this.left }); return o; }, @@ -8571,17 +8595,20 @@ fabric.util.object.extend(fabric.Object.prototype, { } }); fabric.PathGroup.fromObject = function(object, callback) { - if (typeof object.paths === "string") { - fabric.loadSVGFromURL(object.paths, function(elements) { - var pathUrl = object.paths; - delete object.paths; + var originalPaths = object.paths; + delete object.paths; + if (typeof orignalPaths === "string") { + fabric.loadSVGFromURL(originalPaths, function(elements) { + var pathUrl = originalPaths; var pathGroup = fabric.util.groupSVGElements(elements, object, pathUrl); + object.paths = originalPaths; callback(pathGroup); }); } else { - fabric.util.enlivenObjects(object.paths, function(enlivenedObjects) { - delete object.paths; - callback(new fabric.PathGroup(enlivenedObjects, object)); + fabric.util.enlivenObjects(originalPaths, function(enlivenedObjects) { + var pathGroup = new fabric.PathGroup(enlivenedObjects, object); + object.paths = originalPaths; + callback(pathGroup); }); } }; @@ -8643,14 +8670,12 @@ fabric.util.object.extend(fabric.Object.prototype, { if (skipCoordsChange) { return; } - var objectLeft = object.getLeft(), objectTop = object.getTop(), ignoreZoom = true; + var objectLeft = object.getLeft(), objectTop = object.getTop(), ignoreZoom = true, skipAbsolute = true; object.set({ - originalLeft: objectLeft, - originalTop: objectTop, left: objectLeft - center.x, top: objectTop - center.y }); - object.setCoords(ignoreZoom); + object.setCoords(ignoreZoom, skipAbsolute); }, toString: function() { return "#"; @@ -8812,9 +8837,9 @@ fabric.util.object.extend(fabric.Object.prototype, { return this._originalLeft !== this.get("left") || this._originalTop !== this.get("top"); }, setObjectsCoords: function() { - var ignoreZoom = true; + var ignoreZoom = true, skipAbsolute = true; this.forEachObject(function(object) { - object.setCoords(ignoreZoom); + object.setCoords(ignoreZoom, skipAbsolute); }); return this; }, @@ -9177,9 +9202,6 @@ fabric.util.object.extend(fabric.Object.prototype, { _setWidthHeight: function(options) { this.width = "width" in options ? options.width : this.getElement() ? this.getElement().width || 0 : 0; this.height = "height" in options ? options.height : this.getElement() ? this.getElement().height || 0 : 0; - }, - complexity: function() { - return 1; } }); fabric.Image.CSS_CANVAS = "canvas-img"; @@ -11114,13 +11136,9 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.initDoubleClickSimulation(); this.mouseMoveHandler = this.mouseMoveHandler.bind(this); }, - initSelectedHandler: function() { - this.on("selected", function() { - var _this = this; - setTimeout(function() { - _this.selected = true; - }, 100); - }); + onDeselect: function() { + this.isEditing && this.exitEditing(); + this.selected = false; }, initAddedHandler: function() { var _this = this; @@ -11151,9 +11169,6 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { }); }, _initCanvasHandlers: function(canvas) { - canvas._canvasITextSelectionClearedHanlder = function() { - fabric.IText.prototype.exitEditingOnOthers(canvas); - }.bind(this); canvas._mouseUpITextHandler = function() { if (canvas._iTextInstances) { canvas._iTextInstances.forEach(function(obj) { @@ -11161,13 +11176,9 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { }); } }.bind(this); - canvas.on("selection:cleared", canvas._canvasITextSelectionClearedHanlder); - canvas.on("object:selected", canvas._canvasITextSelectionClearedHanlder); canvas.on("mouse:up", canvas._mouseUpITextHandler); }, _removeCanvasHandlers: function(canvas) { - canvas.off("selection:cleared", canvas._canvasITextSelectionClearedHanlder); - canvas.off("object:selected", canvas._canvasITextSelectionClearedHanlder); canvas.off("mouse:up", canvas._mouseUpITextHandler); }, _tick: function() { @@ -11361,7 +11372,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { return; } var newSelectionStart = this.getSelectionStartFromPointer(options.e), currentStart = this.selectionStart, currentEnd = this.selectionEnd; - if (newSelectionStart === this.__selectionStartOnMouseDown) { + if ((newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd) && (currentStart === newSelectionStart || currentEnd === newSelectionStart)) { return; } if (newSelectionStart > this.__selectionStartOnMouseDown) { @@ -11372,6 +11383,7 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.selectionEnd = this.__selectionStartOnMouseDown; } if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) { + this.restartCursorIfNeeded(); this._fireSelectionChanged(); this._updateTextarea(); this.renderCursorOrSelection(); @@ -11465,9 +11477,11 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.isEditing = false; this.selectable = true; this.selectionEnd = this.selectionStart; - this.hiddenTextarea.blur && this.hiddenTextarea.blur(); - this.hiddenTextarea && this.canvas && this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea); - this.hiddenTextarea = null; + if (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; @@ -11535,10 +11549,18 @@ fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { this.setCoords(); this._fireSelectionChanged(); this.fire("changed"); - this.canvas && this.canvas.fire("text:changed", { - target: this - }); - this.canvas && this.canvas.renderAll(); + this.restartCursorIfNeeded(); + if (this.canvas) { + this.canvas.fire("text:changed", { + target: this + }); + this.canvas.renderAll(); + } + }, + restartCursorIfNeeded: function() { + if (!this._currentTickState || this._currentTickState.isAborted || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted) { + this.initDelayedCursor(); + } }, insertNewlineStyleObject: function(lineIndex, charIndex, isEndOfLine) { this.shiftLineStyles(lineIndex, +1); @@ -11713,7 +11735,6 @@ fabric.util.object.extend(fabric.IText.prototype, { e.stopPropagation && e.stopPropagation(); }, initCursorSelectionHandlers: function() { - this.initSelectedHandler(); this.initMousedownHandler(); this.initMouseupHandler(); this.initClicks(); diff --git a/package.json b/package.json index 25a3fa65..e17f07a1 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": "1.7.3", + "version": "1.7.4", "author": "Juriy Zaytsev ", "contributors": [ { diff --git a/test/unit/object_geometry.js b/test/unit/object_geometry.js index adf6acee..19af6229 100644 --- a/test/unit/object_geometry.js +++ b/test/unit/object_geometry.js @@ -319,13 +319,15 @@ test('isOnScreen', function(){ var cObj = new fabric.Object({ left: 50, top: 50, width: 100, height: 100, strokeWidth: 0}); + canvas.viewportTransform = [1, 0, 0, 1, 0, 0]; cObj.canvas = canvas; cObj.setCoords(); ok(cObj.isOnScreen(), 'object is onScreen'); cObj.top = 1000; cObj.setCoords(); ok(!cObj.isOnScreen(), 'object is not onScreen with top 1000'); - canvas.setZoom(0.2); + canvas.setZoom(0.1); + cObj.setCoords(); ok(cObj.isOnScreen(), 'zooming out the object is again on screen'); });