From a1e5d518bf784f6a113a6d90d3c310d6f3d84223 Mon Sep 17 00:00:00 2001 From: Asturur Date: Thu, 1 Sep 2016 08:31:56 +0200 Subject: [PATCH] fixed tests for browser --- dist/fabric.js | 3 +++ dist/fabric.min.js | 4 ++-- dist/fabric.min.js.gz | Bin 67303 -> 67318 bytes dist/fabric.require.js | 3 +++ src/shapes/text.class.js | 3 +++ test/unit/group.js | 24 ++++++++++++------------ test/unit/image.js | 24 +++++++++++++++--------- test/unit/itext.js | 24 ++++++++++++++---------- test/unit/text.js | 8 +++++++- 9 files changed, 59 insertions(+), 34 deletions(-) diff --git a/dist/fabric.js b/dist/fabric.js index 26a8619f..21a3643d 100644 --- a/dist/fabric.js +++ b/dist/fabric.js @@ -21558,6 +21558,9 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Imag * @return {String} svg representation of an instance */ toSVG: function(reviver) { + if (!this.ctx) { + this.ctx = fabric.util.createCanvasElement().getContext('2d'); + } var markup = this._createBaseSVGMarkup(), offsets = this._getSVGLeftTopOffsets(this.ctx), textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft); diff --git a/dist/fabric.min.js b/dist/fabric.min.js index 7bb40899..f3be3830 100644 --- a/dist/fabric.min.js +++ b/dist/fabric.min.js @@ -4,5 +4,5 @@ r},_toObjects:function(t,e){return this.getObjects().filter(function(t){return!t this.__onOrientationChange&&this.__onOrientationChange(t,e)},_onShake:function(t,e){this.__onShake&&this.__onShake(t,e)},_onLongPress:function(t,e){this.__onLongPress&&this.__onLongPress(t,e)},_onMouseDown:function(t){this.__onMouseDown(t),e(fabric.document,"touchend",this._onMouseUp),e(fabric.document,"touchmove",this._onMouseMove),i(this.upperCanvasEl,"mousemove",this._onMouseMove),i(this.upperCanvasEl,"touchmove",this._onMouseMove),"touchstart"===t.type?i(this.upperCanvasEl,"mousedown",this._onMouseDown):(e(fabric.document,"mouseup",this._onMouseUp),e(fabric.document,"mousemove",this._onMouseMove))},_onMouseUp:function(t){if(this.__onMouseUp(t),i(fabric.document,"mouseup",this._onMouseUp),i(fabric.document,"touchend",this._onMouseUp),i(fabric.document,"mousemove",this._onMouseMove),i(fabric.document,"touchmove",this._onMouseMove),e(this.upperCanvasEl,"mousemove",this._onMouseMove),e(this.upperCanvasEl,"touchmove",this._onMouseMove),"touchend"===t.type){var r=this;setTimeout(function(){e(r.upperCanvasEl,"mousedown",r._onMouseDown)},400)}},_onMouseMove:function(t){!this.allowTouchScrolling&&t.preventDefault&&t.preventDefault(),this.__onMouseMove(t)},_onResize:function(){this.calcOffset()},_shouldRender:function(t,e){var i=this.getActiveGroup()||this.getActiveObject();return!!(t&&(t.isMoving||t!==i)||!t&&i||!t&&!i&&!this._groupSelector||e&&this._previousPointer&&this.selection&&(e.x!==this._previousPointer.x||e.y!==this._previousPointer.y))},__onMouseUp:function(t){var e,i=!0,r=this._currentTransform,n=this._groupSelector,s=!n||0===n.left&&0===n.top;if(this.isDrawingMode&&this._isCurrentlyDrawing)return void this._onMouseUpInDrawingMode(t);r&&(this._finalizeCurrentTransform(),i=!r.actionPerformed),e=i?this.findTarget(t,!0):r.target;var o=this._shouldRender(e,this.getPointer(t));e||!s?this._maybeGroupObjects(t):(this._groupSelector=null,this._currentTransform=null),e&&(e.isMoving=!1),this._handleCursorAndEvent(t,e,"up"),e&&(e.__corner=0),o&&this.renderAll()},_handleCursorAndEvent:function(t,e,i){this._setCursorFromEvent(t,e),this._handleEvent(t,i,e?e:null)},_handleEvent:function(t,e,i){var r=void 0===typeof i?this.findTarget(t):i,n=this.targets||[],s={e:t,target:r,subTargets:n};this.fire("mouse:"+e,s),r&&r.fire("mouse"+e,s);for(var o=0;o1)){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.fire("mouse:wheel",{e:t})},_transformObject:function(t){var e=this.getPointer(t),i=this._currentTransform;i.reset=!1,i.target.isMoving=!0,this._beforeScaleTransform(t,i),this._performTransformAction(t,i,e),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=a},_fire:function(t,e,i){this.fire("object:"+t,{target:e,e:i}),e.fire(t,{e:i})},_beforeScaleTransform:function(t,e){if("scale"===e.action||"scaleX"===e.action||"scaleY"===e.action){var i=this._shouldCenterTransform(e.target);(i&&("center"!==e.originX||"center"!==e.originY)||!i&&"center"===e.originX&&"center"===e.originY)&&(this._resetCurrentTransform(),e.reset=!0)}},_onScale:function(t,e,i,r){return!t[this.uniScaleKey]&&!this.uniScaleTransform||e.target.get("lockUniScaling")?(e.reset||"scale"!==e.currentAction||this._resetCurrentTransform(),e.currentAction="scaleEqually",this._scaleObject(i,r,"equally")):(e.currentAction="scale",this._scaleObject(i,r))},_setCursorFromEvent:function(t,e){if(!e)return this.setCursor(this.defaultCursor),!1;var i=e.hoverCursor||this.hoverCursor;if(e.selectable){var r=this.getActiveGroup(),n=e._findTargetCorner&&(!r||!r.contains(e))&&e._findTargetCorner(this.getPointer(t,!0));n?this._setCornerCursor(n,e,t):this.setCursor(i)}else this.setCursor(i);return!0},_setCornerCursor:function(e,i,r){if(e in t)this.setCursor(this._getRotatedCornerCursor(e,i,r));else{if("mtr"!==e||!i.hasRotatingPoint)return this.setCursor(this.defaultCursor),!1;this.setCursor(this.rotationCursor)}},_getRotatedCornerCursor:function(e,i,r){var n=Math.round(i.getAngle()%360/45);return n<0&&(n+=8),n+=t[e],r[this.altActionKey]&&t[e]%2===0&&(n+=2),n%=8,this.cursorMap[n]}})}(),function(){var t=Math.min,e=Math.max;fabric.util.object.extend(fabric.Canvas.prototype,{_shouldGroup:function(t,e){var i=this.getActiveObject();return t[this.selectionKey]&&e&&e.selectable&&(this.getActiveGroup()||i&&i!==e)&&this.selection},_handleGrouping:function(t,e){var i=this.getActiveGroup();(e!==i||(e=this.findTarget(t,!0)))&&(i?this._updateActiveGroup(e,t):this._createActiveGroup(e,t),this._activeGroup&&this._activeGroup.saveCoords())},_updateActiveGroup:function(t,e){var i=this.getActiveGroup();if(i.contains(t)){if(i.removeWithUpdate(t),t.set("active",!1),1===i.size())return this.discardActiveGroup(e),void this.setActiveObject(i.item(0))}else i.addWithUpdate(t);this.fire("selection:created",{target:i,e:e}),i.set("active",!0)},_createActiveGroup:function(t,e){if(this._activeObject&&t!==this._activeObject){var i=this._createGroup(t);i.addWithUpdate(),this.setActiveGroup(i),this._activeObject=null,this.fire("selection:created",{target:i,e:e})}t.set("active",!0)},_createGroup:function(t){var e=this.getObjects(),i=e.indexOf(this._activeObject)1&&(e=new fabric.Group(e.reverse(),{canvas:this}),e.addWithUpdate(),this.setActiveGroup(e,t),e.saveCoords(),this.fire("selection:created",{target:e}),this.renderAll())},_collectObjects:function(){for(var i,r=[],n=this._groupSelector.ex,s=this._groupSelector.ey,o=n+this._groupSelector.left,a=s+this._groupSelector.top,h=new fabric.Point(t(n,o),t(s,a)),c=new fabric.Point(e(n,o),e(s,a)),l=n===o&&s===a,u=this._objects.length;u--&&(i=this._objects[u],!(i&&i.selectable&&i.visible&&(i.intersectsWithRect(h,c)||i.isContainedWithinRect(h,c)||i.containsPoint(h)||i.containsPoint(c))&&(i.set("active",!0),r.push(i),l))););return r},_maybeGroupObjects:function(t){this.selection&&this._groupSelector&&this._groupSelectedObjects(t);var e=this.getActiveGroup();e&&(e.setObjectsCoords().setCoords(),e.isMoving=!1,this.setCursor(this.defaultCursor)),this._groupSelector=null,this._currentTransform=null}})}(),fabric.util.object.extend(fabric.StaticCanvas.prototype,{toDataURL:function(t){t||(t={});var e=t.format||"png",i=t.quality||1,r=t.multiplier||1,n={left:t.left,top:t.top,width:t.width,height:t.height};return this._isRetinaScaling()&&(r*=fabric.devicePixelRatio),1!==r?this.__toDataURLWithMultiplier(e,i,n,r):this.__toDataURL(e,i,n)},__toDataURL:function(t,e,i){this.renderAll();var r=this.contextContainer.canvas,n=this.__getCroppedCanvas(r,i);"jpg"===t&&(t="jpeg");var s=fabric.StaticCanvas.supports("toDataURLWithQuality")?(n||r).toDataURL("image/"+t,e):(n||r).toDataURL("image/"+t);return n&&(n=null),s},__getCroppedCanvas:function(t,e){var i,r,n="left"in e||"top"in e||"width"in e||"height"in e;return n&&(i=fabric.util.createCanvasElement(),r=i.getContext("2d"),i.width=e.width||this.width,i.height=e.height||this.height,r.drawImage(t,-e.left||0,-e.top||0)),i},__toDataURLWithMultiplier:function(t,e,i,r){var n=this.getWidth(),s=this.getHeight(),o=n*r,a=s*r,h=this.getActiveObject(),c=this.getActiveGroup(),l=this.getZoom(),u=l*r/fabric.devicePixelRatio;r>1&&this.setDimensions({width:o,height:a}),this.setZoom(u),i.left&&(i.left*=r),i.top&&(i.top*=r),i.width?i.width*=r:r<1&&(i.width=o),i.height?i.height*=r:r<1&&(i.height=a),c?this._tempRemoveBordersControlsFromGroup(c):h&&this.deactivateAll&&this.deactivateAll();var f=this.__toDataURL(t,e,i);return c?this._restoreBordersControlsOnGroup(c):h&&this.setActiveObject&&this.setActiveObject(h),this.setZoom(l),this.setDimensions({width:n,height:s}),f},toDataURLWithMultiplier:function(t,e,i){return this.toDataURL({format:t,multiplier:e,quality:i})},_tempRemoveBordersControlsFromGroup:function(t){t.origHasControls=t.hasControls,t.origBorderColor=t.borderColor,t.hasControls=!0,t.borderColor="rgba(0,0,0,0)",t.forEachObject(function(t){t.origBorderColor=t.borderColor,t.borderColor="rgba(0,0,0,0)"})},_restoreBordersControlsOnGroup:function(t){t.hideControls=t.origHideControls,t.borderColor=t.origBorderColor,t.forEachObject(function(t){t.borderColor=t.origBorderColor,delete t.origBorderColor})}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{loadFromDatalessJSON:function(t,e,i){return this.loadFromJSON(t,e,i)},loadFromJSON:function(t,e,i){if(t){var r="string"==typeof t?JSON.parse(t):fabric.util.object.clone(t);this.clear();var n=this;return this._enlivenObjects(r.objects,function(){n._setBgOverlay(r,function(){delete r.objects,delete r.backgroundImage,delete r.overlayImage,delete r.background,delete r.overlay;for(var t in r)n[t]=r[t];e&&e()})},i),this}},_setBgOverlay:function(t,e){var i=this,r={backgroundColor:!1,overlayColor:!1,backgroundImage:!1,overlayImage:!1};if(!(t.backgroundImage||t.overlayImage||t.background||t.overlay))return void(e&&e());var n=function(){r.backgroundImage&&r.overlayImage&&r.backgroundColor&&r.overlayColor&&(i.renderAll(),e&&e())};this.__setBgOverlay("backgroundImage",t.backgroundImage,r,n),this.__setBgOverlay("overlayImage",t.overlayImage,r,n),this.__setBgOverlay("backgroundColor",t.background,r,n),this.__setBgOverlay("overlayColor",t.overlay,r,n),n()},__setBgOverlay:function(t,e,i,r){var n=this;return e?void("backgroundImage"===t||"overlayImage"===t?fabric.Image.fromObject(e,function(e){n[t]=e,i[t]=!0,r&&r()}):this["set"+fabric.util.string.capitalize(t,!0)](e,function(){i[t]=!0,r&&r()})):void(i[t]=!0)},_enlivenObjects:function(t,e,i){var r=this;if(!t||0===t.length)return void(e&&e());var n=this.renderOnAddRemove;this.renderOnAddRemove=!1,fabric.util.enlivenObjects(t,function(t){t.forEach(function(t,e){r.insertAt(t,e)}),r.renderOnAddRemove=n,e&&e()},null,i)},_toDataURL:function(t,e){this.clone(function(i){e(i.toDataURL(t))})},_toDataURLWithMultiplier:function(t,e,i){this.clone(function(r){i(r.toDataURLWithMultiplier(t,e))})},clone:function(t,e){var i=JSON.stringify(this.toJSON(e));this.cloneWithoutData(function(e){e.loadFromJSON(i,function(){t&&t(e)})})},cloneWithoutData:function(t){var e=fabric.document.createElement("canvas");e.width=this.getWidth(),e.height=this.getHeight();var i=new fabric.Canvas(e);i.clipTo=this.clipTo,this.backgroundImage?(i.setBackgroundImage(this.backgroundImage.src,function(){i.renderAll(),t&&t(i)}),i.backgroundImageOpacity=this.backgroundImageOpacity,i.backgroundImageStretch=this.backgroundImageStretch):t&&t(i)}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.toFixed,n=e.util.string.capitalize,s=e.util.degreesToRadians,o=e.StaticCanvas.supports("setLineDash");e.Object||(e.Object=e.util.createClass({type:"object",originX:"left",originY:"top",top:0,left:0,width:0,height:0,scaleX:1,scaleY:1,flipX:!1,flipY:!1,opacity:1,angle:0,skewX:0,skewY:0,cornerSize:13,transparentCorners:!0,hoverCursor:null,moveCursor:null,padding:0,borderColor:"rgba(102,153,255,0.75)",borderDashArray:null,cornerColor:"rgba(102,153,255,0.5)",cornerStrokeColor:null,cornerStyle:"rect",cornerDashArray:null,centeredScaling:!1,centeredRotation:!0,fill:"rgb(0,0,0)",fillRule:"nonzero",globalCompositeOperation:"source-over",backgroundColor:"",selectionBackgroundColor:"",stroke:null,strokeWidth:1,strokeDashArray:null,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:10,shadow:null,borderOpacityWhenMoving:.4,borderScaleFactor:1,transformMatrix:null,minScaleLimit:.01,selectable:!0,evented:!0,visible:!0,hasControls:!0,hasBorders:!0,hasRotatingPoint:!0,rotatingPointOffset:40,perPixelTargetFind:!1,includeDefaultValues:!0,clipTo:null,lockMovementX:!1,lockMovementY:!1,lockRotation:!1,lockScalingX:!1,lockScalingY:!1,lockUniScaling:!1,lockSkewingX:!1,lockSkewingY:!1,lockScalingFlip:!1,excludeFromExport:!1,stateProperties:"top left width height scaleX scaleY flipX flipY originX originY transformMatrix stroke strokeWidth strokeDashArray strokeLineCap strokeLineJoin strokeMiterLimit angle opacity fill fillRule globalCompositeOperation shadow clipTo visible backgroundColor alignX alignY meetOrSlice skewX skewY".split(" "),initialize:function(t){t&&this.setOptions(t)},_initGradient:function(t){!t.fill||!t.fill.colorStops||t.fill instanceof e.Gradient||this.set("fill",new e.Gradient(t.fill)),!t.stroke||!t.stroke.colorStops||t.stroke instanceof e.Gradient||this.set("stroke",new e.Gradient(t.stroke))},_initPattern:function(t){!t.fill||!t.fill.source||t.fill instanceof e.Pattern||this.set("fill",new e.Pattern(t.fill)),!t.stroke||!t.stroke.source||t.stroke instanceof e.Pattern||this.set("stroke",new e.Pattern(t.stroke))},_initClipping:function(t){if(t.clipTo&&"string"==typeof t.clipTo){var i=e.util.getFunctionBody(t.clipTo);"undefined"!=typeof i&&(this.clipTo=new Function("ctx",i))}},setOptions:function(t){for(var e in t)this.set(e,t[e]);this._initGradient(t),this._initPattern(t),this._initClipping(t)},transform:function(t,e){this.group&&!this.group._transformDone&&this.group===this.canvas._activeGroup&&this.group.transform(t);var i=e?this._getLeftTopCoords():this.getCenterPoint();t.translate(i.x,i.y),t.rotate(s(this.angle)),t.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1)),t.transform(1,0,Math.tan(s(this.skewX)),1,0,0),t.transform(1,Math.tan(s(this.skewY)),0,1,0,0)},toObject:function(t){var i=e.Object.NUM_FRACTION_DIGITS,n={type:this.type,originX:this.originX,originY:this.originY,left:r(this.left,i),top:r(this.top,i),width:r(this.width,i),height:r(this.height,i),fill:this.fill&&this.fill.toObject?this.fill.toObject():this.fill,stroke:this.stroke&&this.stroke.toObject?this.stroke.toObject():this.stroke,strokeWidth:r(this.strokeWidth,i),strokeDashArray:this.strokeDashArray?this.strokeDashArray.concat():this.strokeDashArray,strokeLineCap:this.strokeLineCap,strokeLineJoin:this.strokeLineJoin,strokeMiterLimit:r(this.strokeMiterLimit,i),scaleX:r(this.scaleX,i),scaleY:r(this.scaleY,i),angle:r(this.getAngle(),i),flipX:this.flipX,flipY:this.flipY,opacity:r(this.opacity,i),shadow:this.shadow&&this.shadow.toObject?this.shadow.toObject():this.shadow,visible:this.visible,clipTo:this.clipTo&&String(this.clipTo),backgroundColor:this.backgroundColor,fillRule:this.fillRule,globalCompositeOperation:this.globalCompositeOperation,transformMatrix:this.transformMatrix?this.transformMatrix.concat():this.transformMatrix,skewX:r(this.skewX,i),skewY:r(this.skewY,i)};return this.includeDefaultValues||(n=this._removeDefaultValues(n)),e.util.populateWithProperties(this,n,t),n},toDatalessObject:function(t){return this.toObject(t)},_removeDefaultValues:function(t){var i=e.util.getKlass(t.type).prototype,r=i.stateProperties;return r.forEach(function(e){t[e]===i[e]&&delete t[e];var r="[object Array]"===Object.prototype.toString.call(t[e])&&"[object Array]"===Object.prototype.toString.call(i[e]);r&&0===t[e].length&&0===i[e].length&&delete t[e]}),t},toString:function(){return"#"},get:function(t){return this[t]},getObjectScaling:function(){var t=this.scaleX,e=this.scaleY;if(this.group){var i=this.group.getObjectScaling();t*=i.scaleX,e*=i.scaleY}return{scaleX:t,scaleY:e}},_setObject:function(t){for(var e in t)this._set(e,t[e])},set:function(t,e){return"object"==typeof t?this._setObject(t):"function"==typeof e&&"clipTo"!==t?this._set(t,e(this.get(t))):this._set(t,e),this},_set:function(t,i){var r="scaleX"===t||"scaleY"===t;return r&&(i=this._constrainScale(i)),"scaleX"===t&&i<0?(this.flipX=!this.flipX,i*=-1):"scaleY"===t&&i<0?(this.flipY=!this.flipY,i*=-1):"shadow"!==t||!i||i instanceof e.Shadow||(i=new e.Shadow(i)),this[t]=i,"width"!==t&&"height"!==t||(this.minScaleLimit=Math.min(.1,1/Math.max(this.width,this.height))),this},setOnGroup:function(){},toggle:function(t){var e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this},setSourcePath:function(t){return this.sourcePath=t,this},getViewportTransform:function(){return this.canvas&&this.canvas.viewportTransform?this.canvas.viewportTransform:[1,0,0,1,0,0]},render:function(t,i){0===this.width&&0===this.height||!this.visible||(t.save(),this._setupCompositeOperation(t),this.drawSelectionBackground(t),i||this.transform(t),this._setStrokeStyles(t),this._setFillStyles(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this._setOpacity(t),this._setShadow(t),this.clipTo&&e.util.clipContext(this,t),this._render(t,i),this.clipTo&&t.restore(),t.restore())},_setOpacity:function(t){this.group&&this.group._setOpacity(t),t.globalAlpha*=this.opacity},_setStrokeStyles:function(t){this.stroke&&(t.lineWidth=this.strokeWidth,t.lineCap=this.strokeLineCap,t.lineJoin=this.strokeLineJoin,t.miterLimit=this.strokeMiterLimit,t.strokeStyle=this.stroke.toLive?this.stroke.toLive(t,this):this.stroke)},_setFillStyles:function(t){this.fill&&(t.fillStyle=this.fill.toLive?this.fill.toLive(t,this):this.fill)},_setLineDash:function(t,e,i){e&&(1&e.length&&e.push.apply(e,e),o?t.setLineDash(e):i&&i(t))},_renderControls:function(t,i){if(!(!this.active||i||this.group&&this.group!==this.canvas.getActiveGroup())){var r,n=this.getViewportTransform(),o=this.calcTransformMatrix();o=e.util.multiplyTransformMatrices(n,o),r=e.util.qrDecompose(o),t.save(),t.translate(r.translateX,r.translateY),t.lineWidth=1*this.borderScaleFactor,t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,this.group&&this.group===this.canvas.getActiveGroup()?(t.rotate(s(r.angle)),this.drawBordersInGroup(t,r)):(t.rotate(s(this.angle)),this.drawBorders(t)),this.drawControls(t),t.restore()}},_setShadow:function(t){if(this.shadow){var i=this.canvas&&this.canvas.viewportTransform[0]||1,r=this.canvas&&this.canvas.viewportTransform[3]||1,n=this.getObjectScaling();this.canvas&&this.canvas._isRetinaScaling()&&(i*=e.devicePixelRatio,r*=e.devicePixelRatio),t.shadowColor=this.shadow.color,t.shadowBlur=this.shadow.blur*(i+r)*(n.scaleX+n.scaleY)/4,t.shadowOffsetX=this.shadow.offsetX*i*n.scaleX,t.shadowOffsetY=this.shadow.offsetY*r*n.scaleY}},_removeShadow:function(t){this.shadow&&(t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0)},_renderFill:function(t){if(this.fill){if(t.save(),this.fill.gradientTransform){var e=this.fill.gradientTransform;t.transform.apply(t,e)}this.fill.toLive&&t.translate(-this.width/2+this.fill.offsetX||0,-this.height/2+this.fill.offsetY||0),"evenodd"===this.fillRule?t.fill("evenodd"):t.fill(),t.restore()}},_renderStroke:function(t){if(this.stroke&&0!==this.strokeWidth){if(this.shadow&&!this.shadow.affectStroke&&this._removeShadow(t),t.save(),this._setLineDash(t,this.strokeDashArray,this._renderDashedStroke),this.stroke.gradientTransform){var e=this.stroke.gradientTransform;t.transform.apply(t,e)}this.stroke.toLive&&t.translate(-this.width/2+this.stroke.offsetX||0,-this.height/2+this.stroke.offsetY||0),t.stroke(),t.restore()}},clone:function(t,i){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(i),t):new e.Object(this.toObject(i))},cloneAsImage:function(t,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:[]};r.type=i.type||(i.r1||i.r2?"radial":"linear"),r.coords={x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2},(i.r1||i.r2)&&(r.coords.r1=i.r1,r.coords.r2=i.r2),i.gradientTransform&&(r.gradientTransform=i.gradientTransform);for(var n in i.colorStops){var s=new e.Color(i.colorStops[n]);r.colorStops.push({offset:n,color:s.toRgb(),opacity:s.getAlpha()})}return this.set(t,e.Gradient.forObject(this,r))},setPatternFill:function(t){return this.set("fill",new e.Pattern(t))},setShadow:function(t){return this.set("shadow",t?new e.Shadow(t):null)},setColor:function(t){return this.set("fill",t),this},setAngle:function(t){var e=("center"!==this.originX||"center"!==this.originY)&&this.centeredRotation;return e&&this._setOriginToCenter(),this.set("angle",t),e&&this._resetOrigin(),this},centerH:function(){return this.canvas&&this.canvas.centerObjectH(this),this},viewportCenterH:function(){return this.canvas&&this.canvas.viewportCenterObjectH(this),this},centerV:function(){return this.canvas&&this.canvas.centerObjectV(this),this},viewportCenterV:function(){return this.canvas&&this.canvas.viewportCenterObjectV(this),this},center:function(){return this.canvas&&this.canvas.centerObject(this),this},viewportCenter:function(){return this.canvas&&this.canvas.viewportCenterObject(this),this},remove:function(){return this.canvas&&this.canvas.remove(this),this},getLocalPointer:function(t,i){i=i||this.canvas.getPointer(t);var r=new e.Point(i.x,i.y),n=this._getLeftTopCoords();return this.angle&&(r=e.util.rotatePoint(r,n,e.util.degreesToRadians(-this.angle))),{x:r.x-n.x,y:r.y-n.y}},_setupCompositeOperation:function(t){this.globalCompositeOperation&&(t.globalCompositeOperation=this.globalCompositeOperation)}}),e.util.createAccessors(e.Object),e.Object.prototype.rotate=e.Object.prototype.setAngle,i(e.Object.prototype,e.Observable),e.Object.NUM_FRACTION_DIGITS=2,e.Object.__uid=0)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.degreesToRadians,e={left:-.5,center:0,right:.5},i={top:-.5,center:0,bottom:.5};fabric.util.object.extend(fabric.Object.prototype,{translateToGivenOrigin:function(t,r,n,s,o){var a,h,c,l=t.x,u=t.y;return"string"==typeof r?r=e[r]:r-=.5,"string"==typeof s?s=e[s]:s-=.5,a=s-r,"string"==typeof n?n=i[n]:n-=.5,"string"==typeof o?o=i[o]:o-=.5,h=o-n,(a||h)&&(c=this._getTransformedDimensions(),l=t.x+a*c.x,u=t.y+h*c.y),new fabric.Point(l,u)},translateToCenterPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,i,r,"center","center");return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},translateToOriginPoint:function(e,i,r){var n=this.translateToGivenOrigin(e,"center","center",i,r);return this.angle?fabric.util.rotatePoint(n,e,t(this.angle)):n},getCenterPoint:function(){var t=new fabric.Point(this.left,this.top);return this.translateToCenterPoint(t,this.originX,this.originY)},getPointByOrigin:function(t,e){var i=this.getCenterPoint();return this.translateToOriginPoint(i,t,e)},toLocalPoint:function(e,i,r){var n,s,o=this.getCenterPoint();return n="undefined"!=typeof i&&"undefined"!=typeof r?this.translateToGivenOrigin(o,"center","center",i,r):new fabric.Point(this.left,this.top),s=new fabric.Point(e.x,e.y),this.angle&&(s=fabric.util.rotatePoint(s,o,-t(this.angle))),s.subtractEquals(n)},setPositionByOrigin:function(t,e,i){var r=this.translateToCenterPoint(t,e,i),n=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",n.x),this.set("top",n.y)},adjustPosition:function(i){var r,n,s=t(this.angle),o=this.getWidth(),a=Math.cos(s)*o,h=Math.sin(s)*o;r="string"==typeof this.originX?e[this.originX]:this.originX-.5,n="string"==typeof i?e[i]:i-.5,this.left+=a*(n-r),this.top+=h*(n-r),this.setCoords(),this.originX=i},_setOriginToCenter:function(){this._originalOriginX=this.originX,this._originalOriginY=this.originY;var t=this.getCenterPoint();this.originX="center",this.originY="center",this.left=t.x,this.top=t.y},_resetOrigin:function(){var t=this.translateToOriginPoint(this.getCenterPoint(),this._originalOriginX,this._originalOriginY);this.originX=this._originalOriginX,this.originY=this._originalOriginY,this.left=t.x,this.top=t.y,this._originalOriginX=null,this._originalOriginY=null},_getLeftTopCoords:function(){return this.translateToOriginPoint(this.getCenterPoint(),"left","top")}})}(),function(){function t(t){return[new fabric.Point(t.tl.x,t.tl.y),new fabric.Point(t.tr.x,t.tr.y),new fabric.Point(t.br.x,t.br.y),new fabric.Point(t.bl.x,t.bl.y)]}var e=fabric.util.degreesToRadians,i=fabric.util.multiplyTransformMatrices;fabric.util.object.extend(fabric.Object.prototype,{oCoords:null,intersectsWithRect:function(e,i){var r=t(this.oCoords),n=fabric.Intersection.intersectPolygonRectangle(r,e,i);return"Intersection"===n.status},intersectsWithObject:function(e){var i=fabric.Intersection.intersectPolygonPolygon(t(this.oCoords),t(e.oCoords));return"Intersection"===i.status},isContainedWithinObject:function(t){var e=t.getBoundingRect(),i=new fabric.Point(e.left,e.top),r=new fabric.Point(e.left+e.width,e.top+e.height);return this.isContainedWithinRect(i,r)},isContainedWithinRect:function(t,e){var i=this.getBoundingRect();return i.left>=t.x&&i.left+i.width<=e.x&&i.top>=t.y&&i.top+i.height<=e.y},containsPoint:function(t){this.oCoords||this.setCoords();var e=this._getImageLines(this.oCoords),i=this._findCrossPoints(t,e);return 0!==i&&i%2===1},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s,o,a,h,c=0;for(var l in e)if(h=e[l],!(h.o.y=t.y&&h.d.y>=t.y||(h.o.x===h.d.x&&h.o.x>=t.x?(o=h.o.x,a=t.y):(i=0,r=(h.d.y-h.o.y)/(h.d.x-h.o.x),n=t.y-i*t.x,s=h.o.y-r*h.o.x,o=-(n-s)/(i-r),a=n+i*o),o>=t.x&&(c+=1),2!==c)))break;return c},getBoundingRectWidth:function(){return this.getBoundingRect().width},getBoundingRectHeight:function(){return this.getBoundingRect().height},getBoundingRect:function(){return this.oCoords||this.setCoords(),fabric.util.makeBoundingBoxFromPoints([this.oCoords.tl,this.oCoords.tr,this.oCoords.br,this.oCoords.bl])},getWidth:function(){return this._getTransformedDimensions().x},getHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)0?Math.atan(s/n):0,c=n/Math.cos(h)/2,l=Math.cos(h+t)*c,u=Math.sin(h+t)*c,f=fabric.util.transformPoint(this.getCenterPoint(),i),d=new fabric.Point(f.x-l,f.y-u),g=new fabric.Point(d.x+n*a,d.y+n*o),p=new fabric.Point(d.x-s*o,d.y+s*a),v=new fabric.Point(f.x+l,f.y+u),b=new fabric.Point((d.x+p.x)/2,(d.y+p.y)/2),m=new fabric.Point((g.x+d.x)/2,(g.y+d.y)/2),y=new fabric.Point((v.x+g.x)/2,(v.y+g.y)/2),_=new fabric.Point((v.x+p.x)/2,(v.y+p.y)/2),x=new fabric.Point(m.x+o*this.rotatingPointOffset,m.y-a*this.rotatingPointOffset);return this.oCoords={tl:d,tr:g,br:v,bl:p,ml:b,mt:m,mr:y,mb:_,mtr:x},this._setCornerCoords&&this._setCornerCoords(),this},_calcRotateMatrix:function(){if(this.angle){var t=e(this.angle),i=Math.cos(t),r=Math.sin(t);return[i,r,-r,i,0,0]}return[1,0,0,1,0,0]},calcTransformMatrix:function(){var t=this.getCenterPoint(),e=[1,0,0,1,t.x,t.y],r=this._calcRotateMatrix(),n=this._calcDimensionsTransformMatrix(this.skewX,this.skewY,!0),s=this.group?this.group.calcTransformMatrix():[1,0,0,1,0,0];return s=i(s,e),s=i(s,r),s=i(s,n)},_calcDimensionsTransformMatrix:function(t,r,n){var s=[1,0,Math.tan(e(t)),1],o=[1,Math.tan(e(r)),0,1],a=this.scaleX*(n&&this.flipX?-1:1),h=this.scaleY*(n&&this.flipY?-1:1),c=[a,0,0,h],l=i(c,s,!0);return i(l,o,!0)}})}(),fabric.util.object.extend(fabric.Object.prototype,{sendToBack:function(){return this.group?fabric.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?fabric.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this), this},sendBackwards:function(t){return this.group?fabric.StaticCanvas.prototype.sendBackwards.call(this.group,this,t):this.canvas.sendBackwards(this,t),this},bringForward:function(t){return this.group?fabric.StaticCanvas.prototype.bringForward.call(this.group,this,t):this.canvas.bringForward(this,t),this},moveTo:function(t){return this.group?fabric.StaticCanvas.prototype.moveTo.call(this.group,this,t):this.canvas.moveTo(this,t),this}}),function(){function t(t,e){if(e){if(e.toLive)return t+": url(#SVGID_"+e.id+"); ";var i=new fabric.Color(e),r=t+": "+i.toRgb()+"; ",n=i.getAlpha();return 1!==n&&(r+=t+"-opacity: "+n.toString()+"; "),r}return t+": none; "}fabric.util.object.extend(fabric.Object.prototype,{getSvgStyles:function(e){var i=this.fillRule,r=this.strokeWidth?this.strokeWidth:"0",n=this.strokeDashArray?this.strokeDashArray.join(" "):"none",s=this.strokeLineCap?this.strokeLineCap:"butt",o=this.strokeLineJoin?this.strokeLineJoin:"miter",a=this.strokeMiterLimit?this.strokeMiterLimit:"4",h="undefined"!=typeof this.opacity?this.opacity:"1",c=this.visible?"":" visibility: hidden;",l=e?"":this.getSvgFilter(),u=t("fill",this.fill),f=t("stroke",this.stroke);return[f,"stroke-width: ",r,"; ","stroke-dasharray: ",n,"; ","stroke-linecap: ",s,"; ","stroke-linejoin: ",o,"; ","stroke-miterlimit: ",a,"; ",u,"fill-rule: ",i,"; ","opacity: ",h,";",l,c].join("")},getSvgFilter:function(){return this.shadow?"filter: url(#SVGID_"+this.shadow.id+");":""},getSvgId:function(){return this.id?'id="'+this.id+'" ':""},getSvgTransform:function(){if(this.group&&"path-group"===this.group.type)return"";var t=fabric.util.toFixed,e=this.getAngle(),i=this.getSkewX()%360,r=this.getSkewY()%360,n=this.getCenterPoint(),s=fabric.Object.NUM_FRACTION_DIGITS,o="path-group"===this.type?"":"translate("+t(n.x,s)+" "+t(n.y,s)+")",a=0!==e?" rotate("+t(e,s)+")":"",h=1===this.scaleX&&1===this.scaleY?"":" scale("+t(this.scaleX,s)+" "+t(this.scaleY,s)+")",c=0!==i?" skewX("+t(i,s)+")":"",l=0!==r?" skewY("+t(r,s)+")":"",u="path-group"===this.type?this.width:0,f=this.flipX?" matrix(-1 0 0 1 "+u+" 0) ":"",d="path-group"===this.type?this.height:0,g=this.flipY?" matrix(1 0 0 -1 0 "+d+")":"";return[o,a,h,f,g,c,l].join("")},getSvgTransformMatrix:function(){return this.transformMatrix?" matrix("+this.transformMatrix.join(" ")+") ":""},_createBaseSVGMarkup:function(){var t=[];return this.fill&&this.fill.toLive&&t.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&t.push(this.stroke.toSVG(this,!1)),this.shadow&&t.push(this.shadow.toSVG(this)),t}})}(),fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(){return this.stateProperties.some(function(t){return this.get(t)!==this.originalState[t]},this)},saveState:function(t){return this.stateProperties.forEach(function(t){this.originalState[t]=this.get(t)},this),t&&t.stateProperties&&t.stateProperties.forEach(function(t){this.originalState[t]=this.get(t)},this),this},setupState:function(){return this.originalState={},this.saveState(),this}}),function(){var t=fabric.util.degreesToRadians,e=function(){return"undefined"!=typeof G_vmlCanvasManager};fabric.util.object.extend(fabric.Object.prototype,{_controlsVisibility:null,_findTargetCorner:function(t){if(!this.hasControls||!this.active)return!1;var e,i,r=t.x,n=t.y;this.__corner=0;for(var s in this.oCoords)if(this.isControlVisible(s)&&("mtr"!==s||this.hasRotatingPoint)&&(!this.get("lockUniScaling")||"mt"!==s&&"mr"!==s&&"mb"!==s&&"ml"!==s)&&(i=this._getImageLines(this.oCoords[s].corner),e=this._findCrossPoints({x:r,y:n},i),0!==e&&e%2===1))return this.__corner=s,s;return!1},_setCornerCoords:function(){var e,i,r=this.oCoords,n=t(45-this.angle),s=.707106*this.cornerSize,o=s*Math.cos(n),a=s*Math.sin(n);for(var h in r)e=r[h].x,i=r[h].y,r[h].corner={tl:{x:e-a,y:i-o},tr:{x:e+o,y:i-a},bl:{x:e-o,y:i+a},br:{x:e+a,y:i+o}}},_getNonTransformedDimensions:function(){var t=this.strokeWidth,e=this.width,i=this.height,r=!0,n=!0;return"line"===this.type&&"butt"===this.strokeLineCap&&(n=e,r=i),n&&(i+=i<0?-t:t),r&&(e+=e<0?-t:t),{x:e,y:i}},_getTransformedDimensions:function(t,e){"undefined"==typeof t&&(t=this.skewX),"undefined"==typeof e&&(e=this.skewY);var i,r,n=this._getNonTransformedDimensions(),s=n.x/2,o=n.y/2,a=[{x:-s,y:-o},{x:s,y:-o},{x:-s,y:o},{x:s,y:o}],h=this._calcDimensionsTransformMatrix(t,e,!1);for(i=0;i\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),i.Line.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),i.Line.fromElement=function(t,e){var n=i.parseAttributes(t,i.Line.ATTRIBUTE_NAMES),s=[n.x1||0,n.y1||0,n.x2||0,n.y2||0];return new i.Line(s,r(n,e))},void(i.Line.fromObject=function(t){var e=[t.x1,t.y1,t.x2,t.y2];return new i.Line(e,t)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";function e(t){return"radius"in t&&t.radius>=0}var i=t.fabric||(t.fabric={}),r=Math.PI,n=i.util.object.extend;return i.Circle?void i.warn("fabric.Circle is already defined."):(i.Circle=i.util.createClass(i.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*r,initialize:function(t){t=t||{},this.callSuper("initialize",t),this.set("radius",t.radius||0),this.startAngle=t.startAngle||this.startAngle,this.endAngle=t.endAngle||this.endAngle},_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return n(this.callSuper("toObject",t),{radius:this.get("radius"),startAngle:this.startAngle,endAngle:this.endAngle})},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,n=0,s=(this.endAngle-this.startAngle)%(2*r);if(0===s)this.group&&"path-group"===this.group.type&&(i=this.left+this.radius,n=this.top+this.radius),e.push("\n');else{var o=Math.cos(this.startAngle)*this.radius,a=Math.sin(this.startAngle)*this.radius,h=Math.cos(this.endAngle)*this.radius,c=Math.sin(this.endAngle)*this.radius,l=s>r?"1":"0";e.push('\n')}return t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.arc(e?this.left+this.radius:0,e?this.top+this.radius:0,this.radius,this.startAngle,this.endAngle,!1),this._renderFill(t),this._renderStroke(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)},complexity:function(){return 1}}),i.Circle.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),i.Circle.fromElement=function(t,r){r||(r={});var s=i.parseAttributes(t,i.Circle.ATTRIBUTE_NAMES);if(!e(s))throw new Error("value of `r` attribute is required and can not be negative");s.left=s.left||0,s.top=s.top||0;var o=new i.Circle(n(s,r));return o.left-=o.radius,o.top-=o.radius,o},void(i.Circle.fromObject=function(t){return new i.Circle(t)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});return e.Triangle?void e.warn("fabric.Triangle is already defined"):(e.Triangle=e.util.createClass(e.Object,{type:"triangle",initialize:function(t){t=t||{},this.callSuper("initialize",t),this.set("width",t.width||100).set("height",t.height||100)},_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=this.width/2,r=this.height/2;t.beginPath(),e.util.drawDashedLine(t,-i,r,0,-r,this.strokeDashArray),e.util.drawDashedLine(t,0,-r,i,r,this.strokeDashArray),e.util.drawDashedLine(t,i,r,-i,r,this.strokeDashArray),t.closePath()},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.width/2,r=this.height/2,n=[-i+" "+r,"0 "+-r,i+" "+r].join(",");return e.push("'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),void(e.Triangle.fromObject=function(t){return new e.Triangle(t)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=2*Math.PI,r=e.util.object.extend;return e.Ellipse?void e.warn("fabric.Ellipse is already defined."):(e.Ellipse=e.util.createClass(e.Object,{type:"ellipse",rx:0,ry:0,initialize:function(t){t=t||{},this.callSuper("initialize",t),this.set("rx",t.rx||0),this.set("ry",t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return r(this.callSuper("toObject",t),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=0,r=0;return this.group&&"path-group"===this.group.type&&(i=this.left+this.rx,r=this.top+this.ry),e.push("\n'),t?t(e.join("")):e.join("")},_render:function(t,e){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(e?this.left+this.rx:0,e?(this.top+this.ry)*this.rx/this.ry:0,this.rx,0,i,!1),t.restore(),this._renderFill(t),this._renderStroke(t)},complexity:function(){return 1}}),e.Ellipse.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),e.Ellipse.fromElement=function(t,i){i||(i={});var n=e.parseAttributes(t,e.Ellipse.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Ellipse(r(n,i));return s.top-=s.ry,s.left-=s.rx,s},void(e.Ellipse.fromObject=function(t){return new e.Ellipse(t)}))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;if(e.Rect)return void e.warn("fabric.Rect is already defined");var r=e.Object.prototype.stateProperties.concat();r.push("rx","ry","x","y"),e.Rect=e.util.createClass(e.Object,{stateProperties:r,type:"rect",rx:0,ry:0,strokeDashArray:null,initialize:function(t){t=t||{},this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t,e){if(1===this.width&&1===this.height)return void t.fillRect(-.5,-.5,1,1);var i=this.rx?Math.min(this.rx,this.width/2):0,r=this.ry?Math.min(this.ry,this.height/2):0,n=this.width,s=this.height,o=e?this.left:-this.width/2,a=e?this.top:-this.height/2,h=0!==i||0!==r,c=.4477152502;t.beginPath(),t.moveTo(o+i,a),t.lineTo(o+n-i,a),h&&t.bezierCurveTo(o+n-c*i,a,o+n,a+c*r,o+n,a+r),t.lineTo(o+n,a+s-r),h&&t.bezierCurveTo(o+n,a+s-c*r,o+n-c*i,a+s,o+n-i,a+s),t.lineTo(o+i,a+s),h&&t.bezierCurveTo(o+c*i,a+s,o,a+s-c*r,o,a+s-r),t.lineTo(o,a+r),h&&t.bezierCurveTo(o,a+c*r,o+c*i,a,o+i,a),t.closePath(),this._renderFill(t),this._renderStroke(t)},_renderDashedStroke:function(t){var i=-this.width/2,r=-this.height/2,n=this.width,s=this.height;t.beginPath(),e.util.drawDashedLine(t,i,r,i+n,r,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r,i+n,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i+n,r+s,i,r+s,this.strokeDashArray),e.util.drawDashedLine(t,i,r+s,i,r,this.strokeDashArray),t.closePath()},toObject:function(t){var e=i(this.callSuper("toObject",t),{rx:this.get("rx")||0,ry:this.get("ry")||0});return this.includeDefaultValues||this._removeDefaultValues(e),e},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this.left,r=this.top;return this.group&&"path-group"===this.group.type||(i=-this.width/2,r=-this.height/2),e.push("\n'),t?t(e.join("")):e.join("")},complexity:function(){return 1}}),e.Rect.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),e.Rect.fromElement=function(t,r){if(!t)return null;r=r||{};var n=e.parseAttributes(t,e.Rect.ATTRIBUTE_NAMES);n.left=n.left||0,n.top=n.top||0;var s=new e.Rect(i(r?e.util.object.clone(r):{},n));return s.visible=s.visible&&s.width>0&&s.height>0,s},e.Rect.fromObject=function(t){return new e.Rect(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={});return e.Polyline?void e.warn("fabric.Polyline is already defined"):(e.Polyline=e.util.createClass(e.Object,{type:"polyline",points:null,minX:0,minY:0,initialize:function(t,i){return e.Polygon.prototype.initialize.call(this,t,i)},_calcDimensions:function(){return e.Polygon.prototype._calcDimensions.call(this)},toObject:function(t){return e.Polygon.prototype.toObject.call(this,t)},toSVG:function(t){return e.Polygon.prototype.toSVG.call(this,t)},_render:function(t,i){e.Polygon.prototype.commonRender.call(this,t,i)&&(this._renderFill(t),this._renderStroke(t))},_renderDashedStroke:function(t){var i,r;t.beginPath();for(var n=0,s=this.points.length;n\n'),t?t(r.join("")):r.join("")},_render:function(t,e){this.commonRender(t,e)&&(this._renderFill(t),(this.stroke||this.strokeDashArray)&&(t.closePath(),this._renderStroke(t)))},commonRender:function(t,e){var i,r=this.points.length;if(!r||isNaN(this.points[r-1].y))return!1;e||t.translate(-this.pathOffset.x,-this.pathOffset.y),t.beginPath(),t.moveTo(this.points[0].x,this.points[0].y);for(var n=0;n"},toObject:function(t){var e=n(this.callSuper("toObject",t),{path:this.path.map(function(t){return t.slice()}),pathOffset:this.pathOffset});return this.sourcePath&&(e.sourcePath=this.sourcePath),this.transformMatrix&&(e.transformMatrix=this.transformMatrix),e},toDatalessObject:function(t){var e=this.toObject(t);return this.sourcePath&&(e.path=this.sourcePath),delete e.sourcePath,e},toSVG:function(t){for(var e=[],i=this._createBaseSVGMarkup(),r="",n=0,s=this.path.length;n\n"),t?t(i.join("")):i.join("")},complexity:function(){return this.path.length},_parsePath:function(){for(var t,e,i,r,n,s=[],o=[],c=/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/gi,l=0,u=this.path.length;lp)for(var b=1,m=n.length;b\n");for(var s=0,o=e.length;s\n"),t?t(n.join("")):n.join("")},toString:function(){return"#"},isSameColor:function(){var t=this.getObjects()[0].get("fill")||"";return"string"==typeof t&&(t=t.toLowerCase(),this.getObjects().every(function(e){var i=e.get("fill")||"";return"string"==typeof i&&i.toLowerCase()===t}))},complexity:function(){return this.paths.reduce(function(t,e){return t+(e&&e.complexity?e.complexity():0)},0)},getObjects:function(){return this.paths}}),e.PathGroup.fromObject=function(t,i){"string"==typeof t.paths?e.loadSVGFromURL(t.paths,function(r){var n=t.paths;delete t.paths;var s=e.util.groupSVGElements(r,t,n);i(s)}):e.util.enlivenObjects(t.paths,function(r){delete t.paths,i(new e.PathGroup(r,t))})},void(e.PathGroup.async=!0))}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend,r=e.util.array.min,n=e.util.array.max,s=e.util.array.invoke;if(!e.Group){var o={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};e.Group=e.util.createClass(e.Object,e.Collection,{type:"group",strokeWidth:0,subTargetCheck:!1,initialize:function(t,e,i){e=e||{},this._objects=[],i&&this.callSuper("initialize",e),this._objects=t||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},e.originX&&(this.originX=e.originX),e.originY&&(this.originY=e.originY),i?this._updateObjectsCoords(!0):(this._calcBounds(),this._updateObjectsCoords(),this.callSuper("initialize",e)),this.setCoords(),this.saveCoords()},_updateObjectsCoords:function(t){for(var e=this._objects.length;e--;)this._updateObjectCoords(this._objects[e],t)},_updateObjectCoords:function(t,e){if(t.__origHasControls=t.hasControls,t.hasControls=!1,!e){var i=t.getLeft(),r=t.getTop(),n=this.getCenterPoint();t.set({originalLeft:i,originalTop:r,left:i-n.x,top:r-n.y}),t.setCoords()}},toString:function(){return"#"},addWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),t&&(this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this.forEachObject(this._setObjectActive,this),this._calcBounds(),this._updateObjectsCoords(),this},_setObjectActive:function(t){t.set("active",!0),t.group=this},removeWithUpdate:function(t){return this._restoreObjectsState(),e.util.resetObjectTransform(this),this.forEachObject(this._setObjectActive,this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this},_onObjectAdded:function(t){t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){delete t.group,t.set("active",!1)},delegatedProperties:{fill:!0,stroke:!0,strokeWidth:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textAlign:!0,backgroundColor:!0},_set:function(t,e){var i=this._objects.length;if(this.delegatedProperties[t]||"canvas"===t)for(;i--;)this._objects[i].set(t,e);else for(;i--;)this._objects[i].setOnGroup(t,e);this.callSuper("_set",t,e)},toObject:function(t){return i(this.callSuper("toObject",t),{objects:s(this._objects,"toObject",t)})},render:function(t){if(this.visible){t.save(),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.transform(t),this._setShadow(t),this.clipTo&&e.util.clipContext(this,t),this._transformDone=!0;for(var i=0,r=this._objects.length;i\n');for(var i=0,r=this._objects.length;i\n"),t?t(e.join("")):e.join("")},get:function(t){if(t in o){if(this[t])return this[t];for(var e=0,i=this._objects.length;e\n',"\n"),this.stroke||this.strokeDashArray){var s=this.fill;this.fill=null,e.push("\n'),this.fill=s}return e.push("\n"),t?t(e.join("")):e.join("")},getSrc:function(){var t=this._originalElement;return t?fabric.isLikelyNode?t._src:t.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'#'},clone:function(t,e){this.constructor.fromObject(this.toObject(e),t)},applyFilters:function(t,e,i,r){if(e=e||this.filters,i=i||this._originalElement){var n,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){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()}}),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;e.Image.filters.Brightness=e.util.createClass(e.Image.filters.BaseFilter,{type:"Brightness",initialize:function(t){t=t||{},this.brightness=t.brightness||0},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.brightness,s=0,o=r.length;sb||o<0||o>v||(h=4*(a*v+o),c=l[C*d+w],e+=p[h]*c,i+=p[h+1]*c,r+=p[h+2]*c,n+=p[h+3]*c);y[s]=e,y[s+1]=i,y[s+2]=r,y[s+3]=n+_*(255-n)}u.putImageData(m,0,0)},toObject:function(){return i(this.callSuper("toObject"),{opaque:this.opaque,matrix:this.matrix})}}),e.Image.filters.Convolute.fromObject=function(t){return new e.Image.filters.Convolute(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;e.Image.filters.GradientTransparency=e.util.createClass(e.Image.filters.BaseFilter,{type:"GradientTransparency",initialize:function(t){t=t||{},this.threshold=t.threshold||100},applyTo:function(t){for(var e=t.getContext("2d"),i=e.getImageData(0,0,t.width,t.height),r=i.data,n=this.threshold,s=r.length,o=0,a=r.length;o-1?t.channel:0},applyTo:function(t){if(this.mask){var i,r=t.getContext("2d"),n=r.getImageData(0,0,t.width,t.height),s=n.data,o=this.mask.getElement(),a=e.util.createCanvasElement(),h=this.channel,c=n.width*n.height*4;a.width=t.width,a.height=t.height,a.getContext("2d").drawImage(o,0,0,t.width,t.height);var l=a.getContext("2d").getImageData(0,0,t.width,t.height),u=l.data;for(i=0;ic&&i>c&&r>c&&l(e-i)i&&(l=2,f=-1),a>n&&(u=2,d=-1),h=c.getImageData(0,0,i,n),t.width=o(s,i),t.height=o(a,n),c.putImageData(h,0,0);!g||!p;)i=v,n=b,s*ft)return 0;if(e*=Math.PI,s(e)<1e-16)return 1;var i=e/t;return h(e)*h(i)/e/i}}function f(t){var h,c,u,d,g,j,A,M,P,I,L;for(T.x=(t+.5)*y,k.x=r(T.x),h=0;h=e)){I=r(1e3*s(c-T.x)),O[I]||(O[I]={});for(var E=k.y-w;E<=k.y+w;E++)E<0||E>=o||(L=r(1e3*s(E-T.y)),O[I][L]||(O[I][L]=m(n(i(I*x,2)+i(L*S,2))/1e3)),u=O[I][L],u>0&&(d=4*(E*e+c),g+=u,j+=u*v[d],A+=u*v[d+1],M+=u*v[d+2],P+=u*v[d+3]))}d=4*(h*a+t),b[d]=j/g,b[d+1]=A/g,b[d+2]=M/g,b[d+3]=P/g}return++t1&&D<-1||(x=2*D*D*D-3*D*D+1,x>0&&(E=4*(L+A*e),k+=x*p[E+3],C+=x,p[E+3]<255&&(x=x*p[E+3]/250),w+=x*p[E],O+=x*p[E+1],T+=x*p[E+2],S+=x))}b[_]=w/S,b[_+1]=O/S,b[_+2]=T/S,b[_+3]=k/C}return v},toObject:function(){return{type:this.type,scaleX:this.scaleX,scaleY:this.scaleY,resizeType:this.resizeType,lanczosLobes:this.lanczosLobes}}}),e.Image.filters.Resize.fromObject=function(t){return new e.Image.filters.Resize(t)}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.extend;e.Image.filters.ColorMatrix=e.util.createClass(e.Image.filters.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'},_render:function(t){this.clipTo&&e.util.clipContext(this,t),this._setOpacity(t),this._setShadow(t),this._setupCompositeOperation(t),this._renderTextBackground(t),this._setStrokeStyles(t),this._setFillStyles(t),this._renderText(t),this._renderTextDecoration(t),this.clipTo&&t.restore()},_renderText:function(t){this._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},_getNonTransformedDimensions:function(){ -return{x:this.width,y:this.height}},_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?u/f:0,g=0,p=0,v=h.length;p0&&(r=this._getLineLeftOffset(i),t.fillRect(this._getLeftOffset()+r,this._getTopOffset()+n,i,e/this.lineHeight)),n+=e;this._removeShadow(t)}},_getLineLeftOffset:function(t){return"center"===this.textAlign?(this.width-t)/2:"right"===this.textAlign?this.width-t:0},_clearCache:function(){this.__lineWidths=[],this.__lineHeights=[]},_shouldClearCache:function(){var t=!1;if(this._forceClearCache)return this._forceClearCache=!1,!0;for(var e in this._dimensionAffectingProps)this["__"+e]!==this[e]&&(this["__"+e]=this[e],t=!0);return t},_getLineWidth:function(t,e){if(this.__lineWidths[e])return this.__lineWidths[e]===-1?this.width:this.__lineWidths[e];var i,r,n=this._textLines[e];return i=""===n?0:this._measureLine(t,e),this.__lineWidths[e]=i,i&&"justify"===this.textAlign&&(r=n.split(/\s+/),r.length>1&&(this.__lineWidths[e]=-1)),i},_getWidthOfCharSpacing:function(){return 0!==this.charSpacing?this.fontSize*this.charSpacing/1e3:0},_measureLine:function(t,e){var i,r=this._textLines[e],n=t.measureText(r).width,s=0;return 0!==this.charSpacing&&(i=r.split("").length,s=(i-1)*this._getWidthOfCharSpacing()),n+s},_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",'"'+this.fontFamily+'"'].join(" ")},render:function(t,e){this.visible&&(t.save(),this._setTextStyles(t),this._shouldClearCache()&&this._initDimensions(t),this.drawSelectionBackground(t),e||this.transform(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.group&&"path-group"===this.group.type&&t.translate(this.left,this.top),this._render(t),t.restore())},_splitTextIntoLines:function(){return this.text.split(this._reNewline)},toObject:function(t){var e=i(this.callSuper("toObject",t),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textAlign:this.textAlign,textBackgroundColor:this.textBackgroundColor,charSpacing:this.charSpacing});return this.includeDefaultValues||this._removeDefaultValues(e),e},toSVG:function(t){var e=this._createBaseSVGMarkup(),i=this._getSVGLeftTopOffsets(this.ctx),r=this._getSVGTextAndBg(i.textTop,i.textLeft);return this._wrapSVGTextAndBg(e,r),t?t(e.join("")):e.join("")},_getSVGLeftTopOffsets:function(t){var e=this._getHeightOfLine(t,0),i=-this.width/2,r=0;return{textLeft:i+(this.group&&"path-group"===this.group.type?this.left:0),textTop:r+(this.group&&"path-group"===this.group.type?-this.top:0),lineTop:e}},_wrapSVGTextAndBg:function(t,e){var i=!0,r=this.getSvgFilter(),n=""===r?"":' style="'+r+'"';t.push("\t\n",e.textBgRects.join(""),"\t\t\n',e.textSpans.join(""),"\t\t\n","\t\n")},_getSVGTextAndBg:function(t,e){var i=[],r=[],n=0;this._setSVGBg(r);for(var s=0,o=this._textLines.length;s",e.util.string.escapeXml(this._textLines[t]),"\n")},_setSVGTextLineJustifed:function(t,i,r,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,i,r,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),t in this._dimensionAffectingProps&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),e.Text.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y dx dy font-family font-style font-weight font-size text-decoration text-anchor".split(" ")),e.Text.DEFAULT_SVG_FONT_SIZE=16,e.Text.fromElement=function(t,i){if(!t)return null;var r=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);i=e.util.object.extend(i?e.util.object.clone(i):{},r),i.top=i.top||0,i.left=i.left||0,"dx"in r&&(i.left+=r.dx),"dy"in r&&(i.top+=r.dy),"fontSize"in i||(i.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),i.originX||(i.originX="left");var n="";"textContent"in t?n=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(n=t.firstChild.data),n=n.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var s=new e.Text(n,i),o=s.getHeight()/s.height,a=(s.height+s.strokeWidth)*s.lineHeight-s.height,h=a*o,c=s.getHeight()+h,l=0;return"left"===s.originX&&(l=s.getWidth()/2),"right"===s.originX&&(l=-s.getWidth()/2),s.set({left:s.getLeft()+l,top:s.getTop()-c/2+s.fontSize*(.18+s._fontSizeFraction)/s.lineHeight}),s},e.Text.fromObject=function(t){return new e.Text(t.text,r(t))},e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},_clearCache:function(){this.callSuper("_clearCache"),this.__widthOfSpace=[]},isEmptyStyles:function(){if(!this.styles)return!0;var t=this.styles;for(var e in t)for(var i in t[e])for(var r in t[e][i])return!1;return!0},setSelectionStart:function(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)},_updateAndFire:function(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()},_fireSelectionChanged:function(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})},getSelectionStyles:function(t,e){if(2===arguments.length){for(var i=[],r=t;r=r.charIndex&&(a!==o||ds&&a1)&&(c/=this.lineHeight),i.fillRect(e.left+h,e.top+e.topOffset,u,c),e.topOffset+=l}},_renderChars:function(t,e,i,r,n,s,o){if(this.isEmptyStyles())return this._renderCharsFast(t,e,i,r,n);o=o||0;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=this._getStyleDeclaration(i,r);if(p?(c=this._getHeightOfChar(e,n,i,r),u=p.stroke,l=p.fill,d=p.textDecoration):c=this.fontSize,u=(u||this.stroke)&&"strokeText"===t,l=(l||this.fill)&&"fillText"===t,p&&e.save(),h=this._applyCharStylesGetWidth(e,n,i,r,p||null),d=d||this.textDecoration,p&&p.textBackgroundColor&&this._removeShadow(e),0!==this.charSpacing){g=n.split(""),h=0;for(var v,b=0,m=g.length;b-1&&t.fillRect(i,l[h],s,c)}},_renderTextLine:function(t,e,i,r,n,s){this.isEmptyStyles()||(n+=this.fontSize*(this._fontSizeFraction+.03)),this.callSuper("_renderTextLine",t,e,i,r,n,s)},_renderTextDecoration:function(t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",t)},_renderTextLinesBackground:function(t){this.callSuper("_renderTextLinesBackground",t);for(var e,i,r,n,s,o,a=0,h=this._getLeftOffset(),c=this._getTopOffset(),l=0,u=this._textLines.length;lr&&(r=o)}return this.__lineHeights[e]=r*this.lineHeight*this._fontSizeMult,this.__lineHeights[e]},_getTextHeight:function(t){for(var e,i=0,r=0,n=this._textLines.length;r-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this.text.charAt(i)))for(;this._reSpace.test(this.text.charAt(i));)e++,i++;for(;/\S/.test(this.text.charAt(i))&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this.text.charAt(i))&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.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),{left:h.x+"px",top:h.y+"px",fontSize:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.overCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea&&this.canvas&&this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},_removeCharsFromTo:function(t,e){for(;e!==t;)this._removeSingleCharAndStyle(t+1),e--;this.selectionStart=t,this.selectionEnd=t},_removeSingleCharAndStyle:function(t){var e="\n"===this.text[t-1],i=e?t:t-1;this.removeStyleObject(e,i),this.text=this.text.slice(0,t-1)+this.text.slice(t),this._textLines=this._splitTextIntoLines()},insertChars:function(t,e){var i;if(this.selectionEnd-this.selectionStart>1&&this._removeCharsFromTo(this.selectionStart,this.selectionEnd),!e&&this.isEmptyStyles())return void this.insertChar(t,!1);for(var r=0,n=t.length;r=i&&(s[parseInt(o,10)-i]=this.styles[e][o],delete this.styles[e][o]);this.styles[e+1]=s}this._forceClearCache=!0},insertCharStyleObject:function(e,i,r){var n=this.styles[e],s=t(n);0!==i||r||(i=1);for(var o in s){var a=parseInt(o,10);a>=i&&(n[a+1]=s[a],s[a-1]||delete n[a])}this.styles[e][i]=r||t(n[i-1]),this._forceClearCache=!0},insertStyleObjects:function(t,e,i){var r=this.get2DCursorLocation(),n=r.lineIndex,s=r.charIndex;this._getLineStyle(n)||this._setLineStyle(n,{}),"\n"===t?this.insertNewlineStyleObject(n,s,e):this.insertCharStyleObject(n,s,i)},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s]); -}},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=i.lineIndex,n=i.charIndex;this._removeStyleObject(t,i,r,n)},_getTextOnPreviousLine:function(t){return this._textLines[t-1]},_removeStyleObject:function(e,i,r,n){if(e){var s=this._getTextOnPreviousLine(i.lineIndex),o=s?s.length:0;this.styles[r-1]||(this.styles[r-1]={});for(n in this.styles[r])this.styles[r-1][parseInt(n,10)+o]=this.styles[r][n];this.shiftLineStyles(i.lineIndex,-1)}else{var a=this.styles[r];a&&delete a[n];var h=t(a);for(var c in h){var l=parseInt(c,10);l>=n&&0!==l&&(a[l-1]=h[l],delete a[l])}}},insertNewline:function(){this.insertChars("\n")}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(t){this.__newClickTime=+new Date;var e=this.canvas.getPointer(t.e);this.isTripleClick(e)?(this.fire("tripleclick",t),this._stopEvent(t.e)):this.isDoubleClick(e)&&(this.fire("dblclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y&&this.__lastIsEditing},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}),this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection())}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,this.editable&&!this._isObjectMoved(t.e)&&(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t);t.shiftKey?es?0:1,h=r+a;return this.flipX&&(h=n-h),h>this.text.length&&(h=this.text.length),h}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; opacity: 0; width: 0px; height: 0px; z-index: -999;",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.cut.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},_keysMap:{8:"removeChars",9:"exitEditing",27:"exitEditing",13:"insertNewline",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMapUp:{67:"copy",88:"cut"},_ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){if(t.keyCode in this._keysMap)this[this._keysMap[t.keyCode]](t);else{if(!(t.keyCode in this._ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this._ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone?void(this._copyDone=!1):void(t.keyCode in this._ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this._ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()))},onInput:function(t){if(this.isEditing&&!this.inCompositionMode){var e,i,r,n=this.selectionStart||0,s=this.selectionEnd||0,o=this.text.length,a=this.hiddenTextarea.value.length;a>o?(r="left"===this._selectionDirection?s:n,e=a-o,i=this.hiddenTextarea.value.slice(r,r+e)):(e=a-o+s-n,i=this.hiddenTextarea.value.slice(n,n+e)),this.insertChars(i),t.stopPropagation()}},onCompositionStart:function(){this.inCompositionMode=!0,this.prevCompositionLength=0,this.compositionStart=this.selectionStart},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){var e=t.data;this.selectionStart=this.compositionStart,this.selectionEnd=this.selectionEnd===this.selectionStart?this.compositionStart+this.prevCompositionLength:this.selectionEnd,this.insertChars(e,!1),this.prevCompositionLength=e.length},forwardDelete:function(t){if(this.selectionStart===this.selectionEnd){if(this.selectionStart===this.text.length)return;this.moveCursorRight(t)}this.removeChars(t)},copy:function(t){if(this.selectionStart!==this.selectionEnd){var e=this.getSelectedText(),i=this._getClipboardData(t);i&&i.setData("text",e),fabric.copiedText=e,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),t.stopImmediatePropagation(),t.preventDefault(),this._copyDone=!0}},paste:function(t){var e=null,i=this._getClipboardData(t),r=!0;i?(e=i.getData("text").replace(/\r/g,""),fabric.copiedTextStyle&&fabric.copiedText===e||(r=!1)):e=fabric.copiedText,e&&this.insertChars(e,r),t.stopImmediatePropagation(),t.preventDefault()},cut:function(t){this.selectionStart!==this.selectionEnd&&(this.copy(t),this.removeChars(t))},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},getDownCursorOffset:function(t,e){var i,r,n=e?this.selectionEnd:this.selectionStart,s=this.get2DCursorLocation(n),o=s.lineIndex,a=this._textLines[o].slice(0,s.charIndex),h=this._textLines[o].slice(s.charIndex),c=this._textLines[o+1]||"";if(o===this._textLines.length-1||t.metaKey||34===t.keyCode)return this.text.length-n;var l=this._getLineWidth(this.ctx,o);r=this._getLineLeftOffset(l);for(var u=r,f=0,d=a.length;fi){r=!0;var d=a-f,g=a,p=Math.abs(d-i),v=Math.abs(g-i);h=v=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorUpOrDown("Down",t)},moveCursorDownWithoutShift:function(t){return this._selectionDirection="right",this.selectionEnd=this.selectionEnd+t,this.selectionStart=this.selectionEnd,0!==t},swapSelectionPoints:function(){var t=this.selectionEnd;this.selectionEnd=this.selectionStart,this.selectionStart=t},moveCursorDownWithShift:function(t){return this.selectionEnd===this.selectionStart&&(this._selectionDirection="right"),"right"===this._selectionDirection?this.selectionEnd+=t:this.selectionStart+=t,this.selectionEndthis.text.length&&(this.selectionEnd=this.text.length),0!==t},getUpCursorOffset:function(t,e){var i=e?this.selectionEnd:this.selectionStart,r=this.get2DCursorLocation(i),n=r.lineIndex;if(0===n||t.metaKey||33===t.keyCode)return i;for(var s,o=this._textLines[n].slice(0,r.charIndex),a=this._textLines[n-1]||"",h=this._getLineWidth(this.ctx,r.lineIndex),c=this._getLineLeftOffset(h),l=c,u=0,f=o.length;ui){r=!0;var d=a-f,g=a,p=Math.abs(d-i),v=Math.abs(g-i);h=v=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){var i="moveCursor"+t+"With";this._currentCursorOpacity=1,i+=e.shiftKey?"Shift":"outShift",this[i](e)&&(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.setSelectionEnd(this.selectionStart),this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(t){if(0!==this.selectionStart)if(t.metaKey){var e=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(e,this.selectionStart),this.setSelectionStart(e)}else if(t.altKey){var i=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(i,this.selectionStart),this.setSelectionStart(i)}else this._removeSingleCharAndStyle(this.selectionStart),this.setSelectionStart(this.selectionStart-1)}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(t,e,i,r,n,s){this._getLineStyle(t)?this._setSVGTextLineChars(t,e,i,r,s):fabric.Text.prototype._setSVGTextLineText.call(this,t,e,i,r,n)},_setSVGTextLineChars:function(t,e,i,r,n){for(var s=this._textLines[t],o=0,a=this._getLineLeftOffset(this._getLineWidth(this.ctx,t))-this.width/2,h=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t),l=0,u=s.length;l\n'].join("")},_createTextCharSpan:function(i,r,n,s,o){var a=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text",getSvgFilter:fabric.Object.prototype.getSvgFilter},r));return['\t\t\t',fabric.util.string.escapeXml(i),"\n"].join("")}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.clone;e.Textbox=e.util.createClass(e.IText,e.Observable,{type:"textbox",minWidth:20,dynamicMinWidth:0,__cachedLines:null,lockScalingY:!0,lockScalingFlip:!0,initialize:function(t,i){this.ctx=e.util.createCanvasElement().getContext("2d"),this.callSuper("initialize",t,i),this.setControlsVisibility(e.Textbox.getTextboxControlVisibility()),this._dimensionAffectingProps.width=!0},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t)),this.dynamicMinWidth=0,this._textLines=this._splitTextIntoLines(),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this._clearCache(),this.height=this._getTextHeight(t))},_generateStyleMap:function(){for(var t=0,e=0,i=0,r={},n=0;n=this.width&&!d?(n.push(s),s="",r=l,d=!0):r+=g,d||(s+=c),s+=a,u=this._measureText(t,c,i,h)+g,h++,d=!1,l>f&&(f=l);return p&&n.push(s),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f-g),n},_splitTextIntoLines:function(){var t=this.textAlign;this.ctx.save(),this._setTextStyles(this.ctx),this.textAlign="left";var e=this._wrapText(this.ctx,this.text);return this.textAlign=t,this.ctx.restore(),this._textLines=e,this._styleMap=this._generateStyleMap(),e},setOnGroup:function(t,e){"scaleX"===t&&(this.set("scaleX",Math.abs(1/e)),this.set("width",this.get("width")*e/("undefined"==typeof this.__oldScaleX?1:this.__oldScaleX)),this.__oldScaleX=e)},get2DCursorLocation:function(t){"undefined"==typeof t&&(t=this.selectionStart);for(var e=this._textLines.length,i=0,r=0;r=h.getMinWidth()?(h.set("width",c),!0):void 0},fabric.Group.prototype._refreshControlsVisibility=function(){if("undefined"!=typeof fabric.Textbox)for(var t=this._objects.length;t--;)if(this._objects[t]instanceof fabric.Textbox)return void this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility())};var e=fabric.util.object.clone;fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]},insertCharStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertCharStyleObject.apply(this,[t,e,i])},insertNewlineStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertNewlineStyleObject.apply(this,[t,e,i])},shiftLineStyles:function(t,i){var r=e(this.styles),n=this._styleMap[t];t=n.line;for(var s in this.styles){var o=parseInt(s,10);o>t&&(this.styles[o+i]=r[o],r[o-i]||delete this.styles[o])}},_getTextOnPreviousLine:function(t){for(var e=this._textLines[t-1];this._styleMap[t-2]&&this._styleMap[t-2].line===this._styleMap[t-1].line;)e=this._textLines[t-2]+e,t--;return e},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=this._styleMap[i.lineIndex],n=r.line,s=r.offset+i.charIndex;this._removeStyleObject(t,i,n,s)}})}(),function(){var t=fabric.IText.prototype._getNewSelectionStartFromOffset;fabric.IText.prototype._getNewSelectionStartFromOffset=function(e,i,r,n,s){n=t.call(this,e,i,r,n,s);for(var o=0,a=0,h=0;h=n));h++)"\n"!==this.text[o+a]&&" "!==this.text[o+a]||a++;return n-h+a}}(),function(){function request(t,e,i){var r=URL.parse(t);r.port||(r.port=0===r.protocol.indexOf("https:")?443:80);var n=0===r.protocol.indexOf("https:")?HTTPS:HTTP,s=n.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(t){var r="";e&&t.setEncoding(e),t.on("end",function(){i(r)}),t.on("data",function(e){200===t.statusCode&&(r+=e)})});s.on("error",function(t){t.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(t.message),i(null)}),s.end()}function requestFs(t,e){var i=require("fs");i.readFile(t,function(t,i){if(t)throw fabric.log(t),t;e(i)})}if("undefined"==typeof document||"undefined"==typeof window){var DOMParser=require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(t,e,i){function r(r){r?(n.src=new Buffer(r,"binary"),n._src=t,e&&e.call(i,n)):(n=null,e&&e.call(i,null,!0))}var n=new Image;t&&(t instanceof Buffer||0===t.indexOf("data"))?(n.src=n._src=t,e&&e.call(i,n)):t&&0!==t.indexOf("http")?requestFs(t,r):t?request(t,"binary",r):e&&e.call(i,t)},fabric.loadSVGFromURL=function(t,e,i){t=t.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),0!==t.indexOf("http")?requestFs(t,function(t){fabric.loadSVGFromString(t.toString(),e,i)}):request(t,"",function(t){fabric.loadSVGFromString(t,e,i)})},fabric.loadSVGFromString=function(t,e,i){var r=(new DOMParser).parseFromString(t);fabric.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.createCanvasForNode=function(t,e,i,r){r=r||i;var n=fabric.document.createElement("canvas"),s=new Canvas(t||600,e||600,r),o=new Canvas(t||600,e||600,r);n.style={},n.width=s.width,n.height=s.height;var a=fabric.Canvas||fabric.StaticCanvas,h=new a(n,i);return h.contextContainer=s.getContext("2d"),h.nodeCanvas=s,h.contextCache=o.getContext("2d"),h.nodeCacheCanvas=o,h.Font=Canvas.Font,h},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){return this.nodeCanvas.createJPEGStream(t)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(t,e){return origSetWidth.call(this,t,e),this.nodeCanvas.width=t,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(t,e){return origSetHeight.call(this,t,e),this.nodeCanvas.height=t,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}}(); \ No newline at end of file +return{x:this.width,y:this.height}},_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?u/f:0,g=0,p=0,v=h.length;p0&&(r=this._getLineLeftOffset(i),t.fillRect(this._getLeftOffset()+r,this._getTopOffset()+n,i,e/this.lineHeight)),n+=e;this._removeShadow(t)}},_getLineLeftOffset:function(t){return"center"===this.textAlign?(this.width-t)/2:"right"===this.textAlign?this.width-t:0},_clearCache:function(){this.__lineWidths=[],this.__lineHeights=[]},_shouldClearCache:function(){var t=!1;if(this._forceClearCache)return this._forceClearCache=!1,!0;for(var e in this._dimensionAffectingProps)this["__"+e]!==this[e]&&(this["__"+e]=this[e],t=!0);return t},_getLineWidth:function(t,e){if(this.__lineWidths[e])return this.__lineWidths[e]===-1?this.width:this.__lineWidths[e];var i,r,n=this._textLines[e];return i=""===n?0:this._measureLine(t,e),this.__lineWidths[e]=i,i&&"justify"===this.textAlign&&(r=n.split(/\s+/),r.length>1&&(this.__lineWidths[e]=-1)),i},_getWidthOfCharSpacing:function(){return 0!==this.charSpacing?this.fontSize*this.charSpacing/1e3:0},_measureLine:function(t,e){var i,r=this._textLines[e],n=t.measureText(r).width,s=0;return 0!==this.charSpacing&&(i=r.split("").length,s=(i-1)*this._getWidthOfCharSpacing()),n+s},_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",'"'+this.fontFamily+'"'].join(" ")},render:function(t,e){this.visible&&(t.save(),this._setTextStyles(t),this._shouldClearCache()&&this._initDimensions(t),this.drawSelectionBackground(t),e||this.transform(t),this.transformMatrix&&t.transform.apply(t,this.transformMatrix),this.group&&"path-group"===this.group.type&&t.translate(this.left,this.top),this._render(t),t.restore())},_splitTextIntoLines:function(){return this.text.split(this._reNewline)},toObject:function(t){var e=i(this.callSuper("toObject",t),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textAlign:this.textAlign,textBackgroundColor:this.textBackgroundColor,charSpacing:this.charSpacing});return this.includeDefaultValues||this._removeDefaultValues(e),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,i,r,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,i,r,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),t in this._dimensionAffectingProps&&(this._initDimensions(),this.setCoords())},complexity:function(){return 1}}),e.Text.ATTRIBUTE_NAMES=e.SHARED_ATTRIBUTES.concat("x y dx dy font-family font-style font-weight font-size text-decoration text-anchor".split(" ")),e.Text.DEFAULT_SVG_FONT_SIZE=16,e.Text.fromElement=function(t,i){if(!t)return null;var r=e.parseAttributes(t,e.Text.ATTRIBUTE_NAMES);i=e.util.object.extend(i?e.util.object.clone(i):{},r),i.top=i.top||0,i.left=i.left||0,"dx"in r&&(i.left+=r.dx),"dy"in r&&(i.top+=r.dy),"fontSize"in i||(i.fontSize=e.Text.DEFAULT_SVG_FONT_SIZE),i.originX||(i.originX="left");var n="";"textContent"in t?n=t.textContent:"firstChild"in t&&null!==t.firstChild&&"data"in t.firstChild&&null!==t.firstChild.data&&(n=t.firstChild.data),n=n.replace(/^\s+|\s+$|\n+/g,"").replace(/\s+/g," ");var s=new e.Text(n,i),o=s.getHeight()/s.height,a=(s.height+s.strokeWidth)*s.lineHeight-s.height,h=a*o,c=s.getHeight()+h,l=0;return"left"===s.originX&&(l=s.getWidth()/2),"right"===s.originX&&(l=-s.getWidth()/2),s.set({left:s.getLeft()+l,top:s.getTop()-c/2+s.fontSize*(.18+s._fontSizeFraction)/s.lineHeight}),s},e.Text.fromObject=function(t){return new e.Text(t.text,r(t))},e.util.createAccessors(e.Text)}("undefined"!=typeof exports?exports:this),function(){var t=fabric.util.object.clone;fabric.IText=fabric.util.createClass(fabric.Text,fabric.Observable,{type:"i-text",selectionStart:0,selectionEnd:0,selectionColor:"rgba(17,119,255,0.3)",isEditing:!1,editable:!0,editingBorderColor:"rgba(102,153,255,0.25)",cursorWidth:2,cursorColor:"#333",cursorDelay:1e3,cursorDuration:600,styles:null,caching:!0,_reSpace:/\s|\n/,_currentCursorOpacity:0,_selectionDirection:null,_abortCursorAnimation:!1,__widthOfSpace:[],initialize:function(t,e){this.styles=e?e.styles||{}:{},this.callSuper("initialize",t,e),this.initBehavior()},_clearCache:function(){this.callSuper("_clearCache"),this.__widthOfSpace=[]},isEmptyStyles:function(){if(!this.styles)return!0;var t=this.styles;for(var e in t)for(var i in t[e])for(var r in t[e][i])return!1;return!0},setSelectionStart:function(t){t=Math.max(t,0),this._updateAndFire("selectionStart",t)},setSelectionEnd:function(t){t=Math.min(t,this.text.length),this._updateAndFire("selectionEnd",t)},_updateAndFire:function(t,e){this[t]!==e&&(this._fireSelectionChanged(),this[t]=e),this._updateTextarea()},_fireSelectionChanged:function(){this.fire("selection:changed"),this.canvas&&this.canvas.fire("text:selection:changed",{target:this})},getSelectionStyles:function(t,e){if(2===arguments.length){for(var i=[],r=t;r=r.charIndex&&(a!==o||ds&&a1)&&(c/=this.lineHeight),i.fillRect(e.left+h,e.top+e.topOffset,u,c),e.topOffset+=l}},_renderChars:function(t,e,i,r,n,s,o){if(this.isEmptyStyles())return this._renderCharsFast(t,e,i,r,n);o=o||0;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=this._getStyleDeclaration(i,r);if(p?(c=this._getHeightOfChar(e,n,i,r),u=p.stroke,l=p.fill,d=p.textDecoration):c=this.fontSize,u=(u||this.stroke)&&"strokeText"===t,l=(l||this.fill)&&"fillText"===t,p&&e.save(),h=this._applyCharStylesGetWidth(e,n,i,r,p||null),d=d||this.textDecoration,p&&p.textBackgroundColor&&this._removeShadow(e),0!==this.charSpacing){g=n.split(""),h=0;for(var v,b=0,m=g.length;b-1&&t.fillRect(i,l[h],s,c)}},_renderTextLine:function(t,e,i,r,n,s){this.isEmptyStyles()||(n+=this.fontSize*(this._fontSizeFraction+.03)),this.callSuper("_renderTextLine",t,e,i,r,n,s)},_renderTextDecoration:function(t){if(this.isEmptyStyles())return this.callSuper("_renderTextDecoration",t)},_renderTextLinesBackground:function(t){this.callSuper("_renderTextLinesBackground",t);for(var e,i,r,n,s,o,a=0,h=this._getLeftOffset(),c=this._getTopOffset(),l=0,u=this._textLines.length;lr&&(r=o)}return this.__lineHeights[e]=r*this.lineHeight*this._fontSizeMult,this.__lineHeights[e]},_getTextHeight:function(t){for(var e,i=0,r=0,n=this._textLines.length;r-1;)e++,i--;return t-e},findWordBoundaryRight:function(t){var e=0,i=t;if(this._reSpace.test(this.text.charAt(i)))for(;this._reSpace.test(this.text.charAt(i));)e++,i++;for(;/\S/.test(this.text.charAt(i))&&i-1;)e++,i--;return t-e},findLineBoundaryRight:function(t){for(var e=0,i=t;!/\n/.test(this.text.charAt(i))&&i0&&ithis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.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),{left:h.x+"px",top:h.y+"px",fontSize:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.overCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text;return this.selected=!1,this.isEditing=!1,this.selectable=!0,this.selectionEnd=this.selectionStart,this.hiddenTextarea&&this.canvas&&this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},_removeCharsFromTo:function(t,e){for(;e!==t;)this._removeSingleCharAndStyle(t+1),e--;this.selectionStart=t,this.selectionEnd=t},_removeSingleCharAndStyle:function(t){var e="\n"===this.text[t-1],i=e?t:t-1;this.removeStyleObject(e,i),this.text=this.text.slice(0,t-1)+this.text.slice(t),this._textLines=this._splitTextIntoLines()},insertChars:function(t,e){var i;if(this.selectionEnd-this.selectionStart>1&&this._removeCharsFromTo(this.selectionStart,this.selectionEnd),!e&&this.isEmptyStyles())return void this.insertChar(t,!1);for(var r=0,n=t.length;r=i&&(s[parseInt(o,10)-i]=this.styles[e][o],delete this.styles[e][o]);this.styles[e+1]=s}this._forceClearCache=!0},insertCharStyleObject:function(e,i,r){var n=this.styles[e],s=t(n);0!==i||r||(i=1);for(var o in s){var a=parseInt(o,10);a>=i&&(n[a+1]=s[a],s[a-1]||delete n[a])}this.styles[e][i]=r||t(n[i-1]),this._forceClearCache=!0},insertStyleObjects:function(t,e,i){var r=this.get2DCursorLocation(),n=r.lineIndex,s=r.charIndex;this._getLineStyle(n)||this._setLineStyle(n,{}),"\n"===t?this.insertNewlineStyleObject(n,s,e):this.insertCharStyleObject(n,s,i)},shiftLineStyles:function(e,i){var r=t(this.styles);for(var n in this.styles){ +var s=parseInt(n,10);s>e&&(this.styles[s+i]=r[s],r[s-i]||delete this.styles[s])}},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=i.lineIndex,n=i.charIndex;this._removeStyleObject(t,i,r,n)},_getTextOnPreviousLine:function(t){return this._textLines[t-1]},_removeStyleObject:function(e,i,r,n){if(e){var s=this._getTextOnPreviousLine(i.lineIndex),o=s?s.length:0;this.styles[r-1]||(this.styles[r-1]={});for(n in this.styles[r])this.styles[r-1][parseInt(n,10)+o]=this.styles[r][n];this.shiftLineStyles(i.lineIndex,-1)}else{var a=this.styles[r];a&&delete a[n];var h=t(a);for(var c in h){var l=parseInt(c,10);l>=n&&0!==l&&(a[l-1]=h[l],delete a[l])}}},insertNewline:function(){this.insertChars("\n")}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown.bind(this))},onMouseDown:function(t){this.__newClickTime=+new Date;var e=this.canvas.getPointer(t.e);this.isTripleClick(e)?(this.fire("tripleclick",t),this._stopEvent(t.e)):this.isDoubleClick(e)&&(this.fire("dblclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected},isDoubleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y&&this.__lastIsEditing},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initSelectedHandler(),this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},initClicks:function(){this.on("dblclick",function(t){this.selectWord(this.getSelectionStartFromPointer(t.e))}),this.on("tripleclick",function(t){this.selectLine(this.getSelectionStartFromPointer(t.e))})},initMousedownHandler:function(){this.on("mousedown",function(t){if(this.editable){var e=this.canvas.getPointer(t.e);this.__mousedownX=e.x,this.__mousedownY=e.y,this.__isMousedown=!0,this.selected&&this.setCursorByClick(t.e),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection())}})},_isObjectMoved:function(t){var e=this.canvas.getPointer(t);return this.__mousedownX!==e.x||this.__mousedownY!==e.y},initMouseupHandler:function(){this.on("mouseup",function(t){this.__isMousedown=!1,this.editable&&!this._isObjectMoved(t.e)&&(this.__lastSelected&&!this.__corner&&(this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()),this.selected=!0)})},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t);t.shiftKey?es?0:1,h=r+a;return this.flipX&&(h=n-h),h>this.text.length&&(h=this.text.length),h}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; opacity: 0; width: 0px; height: 0px; z-index: -999;",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.cut.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},_keysMap:{8:"removeChars",9:"exitEditing",27:"exitEditing",13:"insertNewline",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown",46:"forwardDelete"},_ctrlKeysMapUp:{67:"copy",88:"cut"},_ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){if(t.keyCode in this._keysMap)this[this._keysMap[t.keyCode]](t);else{if(!(t.keyCode in this._ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this._ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()}},onKeyUp:function(t){return!this.isEditing||this._copyDone?void(this._copyDone=!1):void(t.keyCode in this._ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this._ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.renderAll()))},onInput:function(t){if(this.isEditing&&!this.inCompositionMode){var e,i,r,n=this.selectionStart||0,s=this.selectionEnd||0,o=this.text.length,a=this.hiddenTextarea.value.length;a>o?(r="left"===this._selectionDirection?s:n,e=a-o,i=this.hiddenTextarea.value.slice(r,r+e)):(e=a-o+s-n,i=this.hiddenTextarea.value.slice(n,n+e)),this.insertChars(i),t.stopPropagation()}},onCompositionStart:function(){this.inCompositionMode=!0,this.prevCompositionLength=0,this.compositionStart=this.selectionStart},onCompositionEnd:function(){this.inCompositionMode=!1},onCompositionUpdate:function(t){var e=t.data;this.selectionStart=this.compositionStart,this.selectionEnd=this.selectionEnd===this.selectionStart?this.compositionStart+this.prevCompositionLength:this.selectionEnd,this.insertChars(e,!1),this.prevCompositionLength=e.length},forwardDelete:function(t){if(this.selectionStart===this.selectionEnd){if(this.selectionStart===this.text.length)return;this.moveCursorRight(t)}this.removeChars(t)},copy:function(t){if(this.selectionStart!==this.selectionEnd){var e=this.getSelectedText(),i=this._getClipboardData(t);i&&i.setData("text",e),fabric.copiedText=e,fabric.copiedTextStyle=this.getSelectionStyles(this.selectionStart,this.selectionEnd),t.stopImmediatePropagation(),t.preventDefault(),this._copyDone=!0}},paste:function(t){var e=null,i=this._getClipboardData(t),r=!0;i?(e=i.getData("text").replace(/\r/g,""),fabric.copiedTextStyle&&fabric.copiedText===e||(r=!1)):e=fabric.copiedText,e&&this.insertChars(e,r),t.stopImmediatePropagation(),t.preventDefault()},cut:function(t){this.selectionStart!==this.selectionEnd&&(this.copy(t),this.removeChars(t))},_getClipboardData:function(t){return t&&t.clipboardData||fabric.window.clipboardData},getDownCursorOffset:function(t,e){var i,r,n=e?this.selectionEnd:this.selectionStart,s=this.get2DCursorLocation(n),o=s.lineIndex,a=this._textLines[o].slice(0,s.charIndex),h=this._textLines[o].slice(s.charIndex),c=this._textLines[o+1]||"";if(o===this._textLines.length-1||t.metaKey||34===t.keyCode)return this.text.length-n;var l=this._getLineWidth(this.ctx,o);r=this._getLineLeftOffset(l);for(var u=r,f=0,d=a.length;fi){r=!0;var d=a-f,g=a,p=Math.abs(d-i),v=Math.abs(g-i);h=v=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorUpOrDown("Down",t)},moveCursorDownWithoutShift:function(t){return this._selectionDirection="right",this.selectionEnd=this.selectionEnd+t,this.selectionStart=this.selectionEnd,0!==t},swapSelectionPoints:function(){var t=this.selectionEnd;this.selectionEnd=this.selectionStart,this.selectionStart=t},moveCursorDownWithShift:function(t){return this.selectionEnd===this.selectionStart&&(this._selectionDirection="right"),"right"===this._selectionDirection?this.selectionEnd+=t:this.selectionStart+=t,this.selectionEndthis.text.length&&(this.selectionEnd=this.text.length),0!==t},getUpCursorOffset:function(t,e){var i=e?this.selectionEnd:this.selectionStart,r=this.get2DCursorLocation(i),n=r.lineIndex;if(0===n||t.metaKey||33===t.keyCode)return i;for(var s,o=this._textLines[n].slice(0,r.charIndex),a=this._textLines[n-1]||"",h=this._getLineWidth(this.ctx,r.lineIndex),c=this._getLineLeftOffset(h),l=c,u=0,f=o.length;ui){r=!0;var d=a-f,g=a,p=Math.abs(d-i),v=Math.abs(g-i);h=v=this.text.length&&this.selectionEnd>=this.text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){var i="moveCursor"+t+"With";this._currentCursorOpacity=1,i+=e.shiftKey?"Shift":"outShift",this[i](e)&&(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.setSelectionEnd(this.selectionStart),this._removeExtraneousStyles(),this.canvas&&this.canvas.renderAll(),this.setCoords(),this.fire("changed"),this.canvas&&this.canvas.fire("text:changed",{target:this})},_removeCharsNearCursor:function(t){if(0!==this.selectionStart)if(t.metaKey){var e=this.findLineBoundaryLeft(this.selectionStart);this._removeCharsFromTo(e,this.selectionStart),this.setSelectionStart(e)}else if(t.altKey){var i=this.findWordBoundaryLeft(this.selectionStart);this._removeCharsFromTo(i,this.selectionStart),this.setSelectionStart(i)}else this._removeSingleCharAndStyle(this.selectionStart),this.setSelectionStart(this.selectionStart-1)}}),function(){var t=fabric.util.toFixed,e=fabric.Object.NUM_FRACTION_DIGITS;fabric.util.object.extend(fabric.IText.prototype,{_setSVGTextLineText:function(t,e,i,r,n,s){this._getLineStyle(t)?this._setSVGTextLineChars(t,e,i,r,s):fabric.Text.prototype._setSVGTextLineText.call(this,t,e,i,r,n)},_setSVGTextLineChars:function(t,e,i,r,n){for(var s=this._textLines[t],o=0,a=this._getLineLeftOffset(this._getLineWidth(this.ctx,t))-this.width/2,h=this._getSVGLineTopOffset(t),c=this._getHeightOfLine(this.ctx,t),l=0,u=s.length;l\n'].join("")},_createTextCharSpan:function(i,r,n,s,o){var a=this.getSvgStyles.call(fabric.util.object.extend({visible:!0,fill:this.fill,stroke:this.stroke,type:"text",getSvgFilter:fabric.Object.prototype.getSvgFilter},r));return['\t\t\t',fabric.util.string.escapeXml(i),"\n"].join("")}})}(),function(t){"use strict";var e=t.fabric||(t.fabric={}),i=e.util.object.clone;e.Textbox=e.util.createClass(e.IText,e.Observable,{type:"textbox",minWidth:20,dynamicMinWidth:0,__cachedLines:null,lockScalingY:!0,lockScalingFlip:!0,initialize:function(t,i){this.ctx=e.util.createCanvasElement().getContext("2d"),this.callSuper("initialize",t,i),this.setControlsVisibility(e.Textbox.getTextboxControlVisibility()),this._dimensionAffectingProps.width=!0},_initDimensions:function(t){this.__skipDimension||(t||(t=e.util.createCanvasElement().getContext("2d"),this._setTextStyles(t)),this.dynamicMinWidth=0,this._textLines=this._splitTextIntoLines(),this.dynamicMinWidth>this.width&&this._set("width",this.dynamicMinWidth),this._clearCache(),this.height=this._getTextHeight(t))},_generateStyleMap:function(){for(var t=0,e=0,i=0,r={},n=0;n=this.width&&!d?(n.push(s),s="",r=l,d=!0):r+=g,d||(s+=c),s+=a,u=this._measureText(t,c,i,h)+g,h++,d=!1,l>f&&(f=l);return p&&n.push(s),f>this.dynamicMinWidth&&(this.dynamicMinWidth=f-g),n},_splitTextIntoLines:function(){var t=this.textAlign;this.ctx.save(),this._setTextStyles(this.ctx),this.textAlign="left";var e=this._wrapText(this.ctx,this.text);return this.textAlign=t,this.ctx.restore(),this._textLines=e,this._styleMap=this._generateStyleMap(),e},setOnGroup:function(t,e){"scaleX"===t&&(this.set("scaleX",Math.abs(1/e)),this.set("width",this.get("width")*e/("undefined"==typeof this.__oldScaleX?1:this.__oldScaleX)),this.__oldScaleX=e)},get2DCursorLocation:function(t){"undefined"==typeof t&&(t=this.selectionStart);for(var e=this._textLines.length,i=0,r=0;r=h.getMinWidth()?(h.set("width",c),!0):void 0},fabric.Group.prototype._refreshControlsVisibility=function(){if("undefined"!=typeof fabric.Textbox)for(var t=this._objects.length;t--;)if(this._objects[t]instanceof fabric.Textbox)return void this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility())};var e=fabric.util.object.clone;fabric.util.object.extend(fabric.Textbox.prototype,{_removeExtraneousStyles:function(){for(var t in this._styleMap)this._textLines[t]||delete this.styles[this._styleMap[t].line]},insertCharStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertCharStyleObject.apply(this,[t,e,i])},insertNewlineStyleObject:function(t,e,i){var r=this._styleMap[t];t=r.line,e=r.offset+e,fabric.IText.prototype.insertNewlineStyleObject.apply(this,[t,e,i])},shiftLineStyles:function(t,i){var r=e(this.styles),n=this._styleMap[t];t=n.line;for(var s in this.styles){var o=parseInt(s,10);o>t&&(this.styles[o+i]=r[o],r[o-i]||delete this.styles[o])}},_getTextOnPreviousLine:function(t){for(var e=this._textLines[t-1];this._styleMap[t-2]&&this._styleMap[t-2].line===this._styleMap[t-1].line;)e=this._textLines[t-2]+e,t--;return e},removeStyleObject:function(t,e){var i=this.get2DCursorLocation(e),r=this._styleMap[i.lineIndex],n=r.line,s=r.offset+i.charIndex;this._removeStyleObject(t,i,n,s)}})}(),function(){var t=fabric.IText.prototype._getNewSelectionStartFromOffset;fabric.IText.prototype._getNewSelectionStartFromOffset=function(e,i,r,n,s){n=t.call(this,e,i,r,n,s);for(var o=0,a=0,h=0;h=n));h++)"\n"!==this.text[o+a]&&" "!==this.text[o+a]||a++;return n-h+a}}(),function(){function request(t,e,i){var r=URL.parse(t);r.port||(r.port=0===r.protocol.indexOf("https:")?443:80);var n=0===r.protocol.indexOf("https:")?HTTPS:HTTP,s=n.request({hostname:r.hostname,port:r.port,path:r.path,method:"GET"},function(t){var r="";e&&t.setEncoding(e),t.on("end",function(){i(r)}),t.on("data",function(e){200===t.statusCode&&(r+=e)})});s.on("error",function(t){t.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(t.message),i(null)}),s.end()}function requestFs(t,e){var i=require("fs");i.readFile(t,function(t,i){if(t)throw fabric.log(t),t;e(i)})}if("undefined"==typeof document||"undefined"==typeof window){var DOMParser=require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),HTTPS=require("https"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(t,e,i){function r(r){r?(n.src=new Buffer(r,"binary"),n._src=t,e&&e.call(i,n)):(n=null,e&&e.call(i,null,!0))}var n=new Image;t&&(t instanceof Buffer||0===t.indexOf("data"))?(n.src=n._src=t,e&&e.call(i,n)):t&&0!==t.indexOf("http")?requestFs(t,r):t?request(t,"binary",r):e&&e.call(i,t)},fabric.loadSVGFromURL=function(t,e,i){t=t.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),0!==t.indexOf("http")?requestFs(t,function(t){fabric.loadSVGFromString(t.toString(),e,i)}):request(t,"",function(t){fabric.loadSVGFromString(t,e,i)})},fabric.loadSVGFromString=function(t,e,i){var r=(new DOMParser).parseFromString(t);fabric.parseSVGDocument(r.documentElement,function(t,i){e&&e(t,i)},i)},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.createCanvasForNode=function(t,e,i,r){r=r||i;var n=fabric.document.createElement("canvas"),s=new Canvas(t||600,e||600,r),o=new Canvas(t||600,e||600,r);n.style={},n.width=s.width,n.height=s.height;var a=fabric.Canvas||fabric.StaticCanvas,h=new a(n,i);return h.contextContainer=s.getContext("2d"),h.nodeCanvas=s,h.contextCache=o.getContext("2d"),h.nodeCacheCanvas=o,h.Font=Canvas.Font,h},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){return this.nodeCanvas.createJPEGStream(t)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(t,e){return origSetWidth.call(this,t,e),this.nodeCanvas.width=t,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(t,e){return origSetHeight.call(this,t,e),this.nodeCanvas.height=t,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}}(); \ No newline at end of file diff --git a/dist/fabric.min.js.gz b/dist/fabric.min.js.gz index 58379680478f1f4955270ffbe70cfdb5af656b97..0e9a09d591be578a8daf6a6b0002fffd3515b46d 100644 GIT binary patch delta 14210 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 delta 14195 zcmV-(H;l;kjRfb71P33B2nb+N!?6d~&oBvhOCk(VBJCt6AqBAp#Uxb+SZl$-*0!%t7kAEDJ7E*&>VkfJ4|g{$VkZeti_0*3OJ5!U?INo-#X74_sLL>zw5*fT;tu(pr{iKxPJ7HF+0q}_LeSN8;e@kS7N|&xw(I~y2bAVWJm^;@m8VU$>Ck~Mu06!rQWjmfY2g&Zy z)a*`Y=*9K;?y+{x@RA!DxNpnPKCaU~ptV)S9)`DXkK`mIroh-&ifeyOd{sm|&c)9r z_pE!@y*Hh4Gzk> zPAo)v^vy7iDle3y0)tSxs4ygAl8wEfmgLW#f+vcen;KCwAQK)Lx(Sb;j+}gprY5h5 zaRb=nmER`$%w8y{nZ$o(qEM^~OY!kCFIS7%3vWjvOeHh9gxgq6GgH}4gW!BbDFMsQ zoauCbU1BE@UN5+~2%_v_P?lu;*`o1Mp*< z1`YC&uhN+DHV%D*k4n0m1h|>SWFY&HOpwa*6vp21bM(#EjB9`EG|&|&Y`#;)3qp;R zcfn|l0vE_)*%;g8!O1?RY~n%G>@(T{(D7vJ^s|H>ptZQfD%56JgRPum)#eoIq?cPy zULUuJH@voxCX)eLuV7^llJzo{qJ+7wh!ZaY;8z~xSDe)2Lb2>~tm0reH2Y!23~kMk z_o{sOvIu2RfXsgm3J`@16IN|BIE_~kmUAlGA4b_(c^*Eg^cMGXSf2Uwc=%uM8V|W6A!irCfdW)a*s{4r|At8BhJ-qrc6gMZ9a$m zxewLw{5&sa-(L4}S}8P%#V_o@UdqL%DqUJ_GPHl0-;@Z=JDJXPwTaBYmp@R^_i+=7vh3qieCrDL)4^xcKv+p0+rj1G0O zx~M{w3a=rRsQYhAE{@6kFd1QhGGRRU*FRIiPH8&VJEl#Y>-Knl16E-6}2KgKV#Id}wQ9zuP`HlH|? zfpsv}6c$>+C9cAUJ)yg>qN2pLo(?w00f2v9MR8og^>3zz5c8AiC)TRy>Dz%2Bo;$i zIKu%1tx+Dc6FaKbLQUojWZU~!!myDUHR>0Jetj}7)h<%1fUuuNl`W%HNvJwsQWGZa zwD$1SxcDQa&GL^)y{(zuhccHQ-ru4)x&x0NK}weV zAZ5KdjLQy+hMhBP6+sualM0r7V-{)4^nRjOG#_ zlkGsIn^;DjawgA)rnHj{+3l;5$IXAqblkvQohK_?*~Zh;It7(3`M7bD=gywSWtSQU zo~mKAZ0-5CE$eUEZ$sx`t}^-SM$q{riSeOYVE(AGh4 zWexl|E(==<66)jhSIIMtpRRocV<=z|uMb@%1%)-Q+oDUAjb&mxSnH=iiB!?0IfW)2B1XFpf%7-Da zhCg3lQia3Op{jxm#i7_TZ{}O`&cZ4|ECh91g_v6K=9)%n<0_RlCfp@6nK0vPC7;T+ z}%-x>DL5aW9VmdD?J2jP@(#uz`pTGb9mkT)W7q8#` z2tVHZ=c{D+mHOV5w2FkW``Qi@ZQg{(B`m6)y~@9S%4zD$oRd#H#-hN{Vdkg`6Vt;h zA)$ZKE+eOhM-d=nMs3p~bn*KuT~0&aYOWCVx$8 zAgF`Lps6)4cD=q^Q6#dwqjxKPLqY~)E@FI!QVBdldtrZi{50Z>?9uS+$j7!GTPjl+ zV9oE*Hq&ik4JQOYmC*lL9NP2gG^^{fs+AG+qs+OLLZ~Z4+gN{PZz9X%u2fCT08*uU zdV7hPATrko-2zA)vjm9$Xg)*6_CSH+C~DGhC_>r24+|A>dfZ(FgSV^256%( z%NsI49>y8`#G%msI1|O+0z%FztBb+Yc=+Wr*~il_p_A#V0tgD_(o^}DZ1TUKJ$t4q zyv!Eq?P!=iQ-6P}3}jzn3_M{aLUz8>bUK$d(aN%U1efNXOr4=^1(*8;bs>!~VYwH2 zy)W}h{E$Y&=_Tx#sQ#R?sNpAA?Zw3>!TX5;;L+J>C@km`%`nL(nf!^i!y_G0#t=o* zjUtUgz?L`PX7lu8UQ+h7O&Us0VNEq{+iOjnbd{Z^Hbj3=%xNA za{3cBf~uraC1<%(6YdYk#;6B5J^OIlad>pp3X+?NC9Re-yo|-{HSAt5un#v%aqVtj zxdsO&wnk&5ASxZumN8yo)F85LuxfbD0K8E!Xo6;BfCglGP9pQ$OtLdjHOcIe@m{BJ z-D&rIOG$PSn<>{! z3XC0aGvI>g!W-05#RZAB>9_8mE~tAPTZYI=O=o`}IVB0kEAX)56xLfuF1DUqaYUq`)ZGiUJdKyw6$m}T~Ya_C{qe86R z@4WlPYvydfShu^jp^>_?L_T~Dm}|G&FQ8n^el@NS%+v@z{FAvn%$fR;<8aY$p#2Bn z*{pwDO#~?v4}GzhilRtMRPnviN4TdIm90+>;-_9jhD~D>D9Cy%Q$16?1xhR>G0Id3 ztbl2o^yE=)eTiKgZKi_EII=qWm}j4mh0;=eSC^?hYg*dP&aVC1O+h(H+>A&!3&W9~ zKZ-5njP>ht+x4IHm`j3y{kJG`NUI!0<8gl=wo)NyzDIQbVE8Q^=+W#x%+`yf& zFRnNVwa_lDl{&-G7i!P-;f=l+H!NyNKRbRJ_jC9MecXvixX8j9gz?Kpj)64Nhxd#S zKkE?S%Lt2^@QJ{4eA1GF=I4qKN%6YA)uTMtw|dm9$4$SxaWq`FoA-yj1Gi~^s2YEt zG?NWqN9a!>wwbt9)Vq?FxDzFN(G_q=a1^u2V1&USlrBLlut_AO{*q|a=(EvASk!=D z>T8av#63D>s_6Nkj1N58Wk-#zdoX3JG1F}`ZMt57_?s<(sn?}aUf2CqX0X?FnU-Dv z*}w(=)vPHoU4g%;aP~yO&>SZmHAm)Zs`MTrzRDBMFha}!EHPh`PP1mDO~>gtb4~9(h)~QoJGx$! zm+9iU2-YhkDS7=vxvH~S`Kg!;CAs%WnBt6?%?mVA_EDwOkj$I@l}mp?b&=W_4{NRh zFuL=$<#iehRNXu1Gr(^8i>>m{bI(d`~O{Y5g3dk)$?8Q$O1{N$_Cd^sH=^ry#(Q;s?x zeZ4Yqz2^9ogsYXYtF=NWOjba4*4x~c(Fom8Yu7Q&605L|FvfovbA29{c#wqHlnmNC z4s|BH0E57IEu(+3OPRX7b&c=^oye@imywZ5G<9jp=<&Is< z)0&Ev0zrC1e(?7!9$F)}2ar#)S zRvspB11}Cu$vJyD>3L2XZAKQOM^=SC(o6MlS-?+v;mzQO<99Hc+LmL`uD7yYGoi3Y z;6Q{Pd;IB$Rjj?jnCJSWEBZjf8GY#L@05N}PB~uQ-=lwO22GM?{wE^zy4+;DXL*`s zeqJrSyVg!XXq-4tjK|f-_!2PYjfwGod2%zpgzNP&xjwr*j~BQqwb0&2V0O{OEnd-L zHHgdypbd67fR8F1z()Kju)jT+z*nuIMDe%>01MDne}*?ykxLhkJZbwZyO)_o1Igex z;wimCyas=SZ)pW2aH1|?xGooQIE<%4skA24mnZ>*K6|3j$Sr(ZO?CVN3FoxvnwH>! zNfGpLTFSu02Ku8GD;P4?t;pc$HOn-65eUQ zpHUS-*&wzZdPY^hbWK6kVTkNv;m3sjP0FnY8b5!)iu6gj2GnuJJdvEa#KvDpq@;v* zC@_-R<}a1@e(5=S^++G1xo|CFE?IfJz_%twRam!tb~}P%_$d7SeNWlxb{WlTNF5EH zg<+TYUX9JLKXLloJ>z!aJ^bVGkY~;AuFG3iz?xyVMk32e7RegCVj9l;a4C&o;{8J1 z@#24EHC~AL%-wDji_qgOx;T#s;}x2QBlr|0u#{Dc5Pj$UjMR^$c-SFnf~OD}&i zqky^P24cO4ui!O&a8UXwRv9Ahxf>VuX z=yTYH`t^4T^v&Y%ys9=Qe za7SzaiF6iBxD?C6-&x`BP$aQw{2Iqi!>@U_U{;6Di zoSWoaLyZfn3B%?T%fSBoEI*$#y;d38tB!VP>6VZ&m^4H0oS~G>@y5+L1ss5uvuu$y z*~Z4cPZdaMgge3#@J44LV4!1tO8^4*LLfO zFwv}+d|)LtDc}K2fPhKWslscMdjGJL+jcNEspE4pyz<4_IIDnz?$YUyBb$L;y)i6B z>lCQma=Ev6!KY-c&{mmN+;4viSg}=);+fIViQgeCJG`NONZnbDF}-h6OpAB?p+4rXt@e2Pp#;c3iAqe9)XUzR|vQM)x{TV!IAIDr&fO;JXCT2bhkQZLXuy`*vjfq4RYd7=_& zGJ<>V20rCsNMjK$Z_s{BsZ~`c1>ubDr&vW{=PFd~^@o$zJ7Sa>D^5>n1|HfFpn12Z zEy=ZukhDg=E4T$RCINrOe^hm{GcH0b0z3w+cme;@pxt8q=M4q{tk0b^G_OTucy5>P z^(V+Ie*#{;CxlKh(Y5uu_Xu|Y&*ZHM>0s*d9XB6u*$Lyv=d)Qh`)69r7UZF?%YPW5Z&nK(e-}TBmb&ZKtl)o_G-*TA;}&qR&KNyk z^P8+(H9g+^NVQAQpnNzOgljn{UuHWX7xk$JPqD5wGUM)53__`9Mwuo7U4cRA54yhV zpy1@rCLDbY2q}=D9H-alPI3_krEbzAhCCN8&HJk+yTp< zohv`jVu06hmneS@V`q=CT!IIFo7NyZGlz=|+|hW^S(N`K9idO5w1RzGylv*VU22Nq z+On*tL2l4KV6<9#0p_j=C72z%1{m!Xy#9Lj+s?8;00w65n}Wa)Bkx^$+$sU;4czH= zXgq2A@C#mejLWb1Z*rW;lr<}q#Y1kBqFj06;G!(B@e6-)-)u7Spto9km6lN<8o#l;fvxRPYGm0U`WOsEl01vRUh-a7$)1Usmw~nPZt) zy3g6G$5z)m8OhMM^rsz5&yHx)L;=(xsi9vY8#h#TVp^g6DhY*Pb2pe3ch7e5gr_)LXI^Y+sH6-i$sA zNh+U{Lil0^$A|WFluU-?(l_3*@;J<*D9-zRV$R3MAKo2zS3Wq%Phl#$iGn~sYcJ>L z)=Phet>5e0HPO6)W=4U=+=Lj~nmIo|ILOQdGQ96;HJ$TQ)EPN` zmjeN;=mhp+)F|nI4HtMwV@9Ro!%;lm|1f{~&_6#O?-!!4igsw=ha5biGk=$w-7&r3 za`(xiwg>Ho(ine8L1_g>!1X$QugVX?F$TB%4qZ?IgfO*ezTx{&`hYpuGxK22{4wZq ztBac$!jTB=wqV~KL|@X}|M_Q`p6Ksg@H(a-*UH=8F%Qr|^TlUL3za{rWMS9`kQN87){m$TyQZsWu z)Mw(cWEebhXqMp!Mg&CH1A1a{2+RZ8ZRPksTMsR97J-A{@(+5N{Q%EdTYM6V4q^}Z z9o?PheYo4h&-}Igq0=R!O^~4l#p0xN%mvNPDoW@6&xs;<}ybSlN*S5ua z$okz)GlvAIONOF?pUNEf2;Qg}LrfNDRJC0)$C*+dTwK_--xf5Pmoyp7e7>d9#OnmU zt(6BkWa#F(BO=+>eV1!$t~8#!GawwOp8d;FaTv-7h5RD7PS+f5zC`Op<{E#ru$6T~ zXCjiUtj@pSnY4P5v%555ND_@2?eHWLd!;qL8me+p^W%b8RHx=!l+!=(IAcHqX&S(b zekYlu116tqwT&s2JTWg+!Z)b>LpjsYBDy`j9hCbKBka03(W&D*sJ@p(S2KP5c*(Aw z(4q6PO&3!&!cTJHJxNa8@lk*HE<#H+ER3|b7RI9@znTqojDdsEqoPB!XGY$rD3VO- zeAb~Ie`;3&3Ze9ROkEf4O7xq$z_>3F3c%;bNSdHk;kaIJW|^8`R6-7-pmP|Gm` z69i1Hi@aJc;aN*O7&-rIoD;Jgnq4<;JKwK(eC_26nb-X5ZZrIgAeVAFfc#* ze1eHl;Qz^h{ybgCKhcEi=vIEc6<=>pSMtwQ7z=Mws4C*fqw5}g5r1e+eoZ*i;ey)I zRje_iZ^<3QR3jI4#SGt#Tm%?f_-oWgX;y{b+ZBF~8MYp|=sUKs^Qg^p`jB{R5O;SA zQ%4x|lD);Q08?0$6B>WF&JkOMpBnJW9NvB+!)srS_lr z-+ur2o=sv3tyhyT;*``;>FGI*LKUA#0RGiyMBy1ss2#FQON?A=0dw$FDCGP5F3UEx zzvy)a&x>D5k9bJD9>$^CHF7DUBy8C3xs0OJYtUmZ>-W9#0gu2oY4rH*-aKMXCFN50 z=d9@u&oSlu1b~0nAC4t^PW@pQ!a{*8%uJ{=&aBA9tmNh47B~C_PGD5Hz>^0WUzT-N zHEqvIY2Gnz1_2W!bB=JlZL784@2flO(rodBN)n$ zq%6$KWiDisGyqzh#I0V@tPWcDhol8EUpmYL+dJG|GRuGa1P zvV(?vZKcneJ%=cc&kPf-TZtIzDxetzx_UY^Gu6ipwLz?IKqEjPUt z-j3h0O<-q6!+I=yQ^B&wXla_?-=ml$PZ(OD<<=^GzrCb!DwbNDr8GhGT7!T3LqmJu z(|NddfqstS7&KWE;NP|`e&IG58~Y!Wg%!r3=23qTd@=nBebTpMAvN2hTJat+4)sLYjE)A@eXaT}%!NgSxhTt@i$j2rx|PrDeT+&QeN^XX zg(QnEBIV!)Hiz8VcrIt%!x-KLa_dvw4kl__3NX-Y?Haf*J2h&fPT zke)4YjdS!#)V(g?_OBhv;IYuuj8re6#3Fy|kW5A&WeDmu%k>p{QdSSQZ}!}m0E>>qW(aYX{oiXJYXL@$%rptJkRJ{n`goRaUH=}vVy-<`BFjx z&i6#6C?RrBpQiZ9MBcoBr`ht=N6f~8-6#ZBGl=#w9sELcG`n1E>7^T>zKw{zyW@WW zh;I|D!Z-RcZNIH~9i?vP{8%=_kkM?--N?q8P~SK6lP?DY#ohC%9(^WbxX<2ixAg7S z`leTdlVcnEmrl-G{rkUaJtzfKN5jzsE&Wbf^qQ_T*%#VH z%J{m&c-w0l?igyf6r6aEyS}ZKKFfb`gjKDlLVtP9zs=QY-F;)x;ENUQQ44CzSnSxk z+#P+JC{w%i&D5w29^O?k(` zpwdp<3Y11_RU1c`G{~L$$8OQvb{&zN$tFQrx5{xX?80lo&7jC?<`JB9!PS5Dfil3Q z=p3IF^UL5%A8y$Z(8s>}09YpBhN9W_+_7~cl#b9|8to3tO3jeAZg4Rzt0JpZEpAJ~ zHg|_0#`+FhrnbHPfh2|9n_{0d%rL$dQTeT-*0oQYuOPX7B9HeU+3m!Qj84^E1^q_J zu&aBQYqJ&gyX)z*U4#*vEJA-hYwq&gVhK0#g|RRo@`VD`p*UI|Uh|VFMFhQT`@qf5 zcL)nQm+>}*fBaZ5$JSfYQ7O(t9sHxMi(J4XEm^T1e{%wE~h3i+uUpWY)hLUGeGv7Vr1U6L=Nh-rv{w|IcklWMJIednIQtVxoVf(LA1E_>2fs zdqZa@<>Pwk51}9I!xuQ)Huhr1gyNmJVE}JrHTmE>`rOap+~j@u1!t!`tx}{VH$7%-JG8cCiLHZ?JPz5KeAivwFh|Ged|5ALnMEorn~pc$9I+&%T=R0 zdxL*HzO!k$yj9jq@bgb}q~|pKGxJ#jKcG~2^!v{&O;T88cZTtn!x(Aqb*x zjQ8~AFBv4G7*?$jfNWdcOE!ug43e{Zqti6a9Nlqm<7B)RE`gE|$eG|@)&w?=Ps~(& z0e7PQAzhB{z8-%COivcX-;4sLk`Lmi|8NS1&qjeIfC}PgP-L|F@8PaJ`+}Fer0e|b zOI}8%&`|glFGMm9W&iM$ecc-38&7v%4BF#<0Yd->@F}fkFG-LVpxIVaE&fBm;5|U$ zD;QE-#;;)@yiIl;k}2JN1uM|rKLPpc*?g#%j`$4(q_KZ9b|Mj6R~$EG*NR0)ux~HQ zS!NPo%8ev}=b2S>rfZ*{_hh0VGDq`u=oCU6ri`9kcIOz`W$ZvoSettHsrFFgVq$G}}XzrpstgiB0$rh9f7yq-i-=`Emn zzw82xd@X;qLGs?+hxqRRh!B4gHQIcPI!#CA3ra9^zUL0c*RI>IJS;BTZf#OH?lU*l z!5L4>Nv}$DQb++h-M7xIH>pQOoF!?$RHlyJUWHn^imOPb-+=~E-7j`%RK!K3MXOwV zo_hpk^7Of6%p(nRAgm=QxWnw*_XG}QnKO0z^=*HJGrpCfu6y*M(@aoC-y@o`jQVX* zd{f-2kQX-NzL&PQzo;8Z?Z_EIBJKf?R%%@lZt3}I2KL`=-BeIL{PxaBe4*mR9zeiH)c&SCXtHBe{q!sZGDwL3CDzkUo}?%T>&o_Eq-7ZATZlNWO;v)-+u}#L;$9t3YBEJq@Q$!RwnyN$nRIIj8Xr_PgJe51 zrPVs!z~i~qJK60vIFrVQTO*%EvQM9KaIlrf*EUt{onQ{W-OFkp*7kw!(&~R$!ex0P z;3~ggZX-lH6QKISJv(-6faM_GAYrvVSP+~}zc%T&-5sxZPb z`Q;-39BA`Q6&j2L8!>-71vfW5(uQ_IbrHH-+v_#PQM)ALc6ZkF1LM0$;M>E65w+Xjyl#q*@g<^9e^_u2avD59YO2we3@C7 zTx!c4y34BgNv}m=Bch9e9Xrq^bGc1b6-9NZDH7?OsOjH9Flm3i8_(eO$IHWypp^Nx zPfA!f8;@V+yu-2|!C15I@NLRB!+;7VlLGxkr$saVIT+WC0=5sB7 zK$kv#btq!kZwfo#l&|y88C)$@Dh!X0etiGK#p|D+zxd_N+aE7pzWMIWFYg`^m7db+ z{Oh}4q}aj^{@6~cKJ5gpp8mbYl3H@p zlEyUW((1NLu&_xY(S)IJHX(z)oj^zxIJNZqjK%Fvg_Rmi(1pYo0kR? z;oaZgt;d-RBQF>QGNMEP$s8+1kMizaVWu>ay}$&cImVU1U_oWr5(4?%z~|4!(!%VhaZ{`%?Z-~JxuYI1c!0%%{zD)?0v?s zO|Obl)F?y2ttcqOtcCe099{8|4zj3F$|6xil+}N&?6Xwo^yC;PbNZn;JU{wxc>7~S zt=6jW^m*2$+_R}?-20E$f|!a+-;KKNKIV0PxyVNQgBZaevo2wlWRYD?WfP+e%7|J< zQnfBdd7UrFT;IZ;1`Y8_YmBQk=FkWDH#ICs!MBJ?8@{y{zK3ze(z;C!@pu19;m3gdL26AZAIYL=QDaO4IErnWIw|A*w2q!GNiae>&AghB#UOlR5wq z|HxV(P)$D5$szvTpXmb8(ypXiAF9~^N`QlOXqk(O42efsJx!O{Z#N5+-v=kh1b8@X z0XuBc>6W31U@xRBc8JP!dK0=ljqTJaiWhwT6NGnbcr-nsP9;V0-1XL1un;5HN6;VR< zJ!iQb?Tk^{R;0+_jtNc-ZH~Pmy9a+PI``cg9gxPwiL*|fD2oN`Rxe}B#Mq-Qq9|^l z!YJ5tE1)Dx#1{|a>Z~|Vh?tHVMM>dJm`5#!tWbI6;%vi5oq=y#YDy_b)xm6Q2^Kri zpDG1*5QVM#T11&o?$&fQ$Bon*0^lmiE=8G@4UDH{_RL9UmsV`+wi$O#&pUq)EAYz$ z6I=3F>h?gn8YnjdJthq%dp=qtc+z8vw6R-qWOmM&btLA#J%MJ|+9X}A z()Lm)gQKvb>WwHZ_fhwJCQ{hJ#lu+mIxIdVc`Psm#xzy!a1fQU4HKy4p$RQ-5;}Sx zW-3|^O6;rq`+?D1larxI_;-I&QqsTf#D16uQ0DgIgR8l9>vkz1*BM6W0U}>&kYGMT zcx;jO8#T4?w|wyoqyZF=xNGlhbb`ou2@6}EXl3^jR*)v;+44MA)>u4+VgsB-j!um8 zNLyFMRg|ovMgKakq%>Ee=l$8FC*Ll0C?;Pe3z}9qf=1Wz4CqZACDVTp9T-#X8EKC= zr4gfR7&D3~MB?J~3f)fMfh(ali>sYY~ zG8wC%7Rov-3>`I=5_lfOL*E7Vh*fQDcWu*)6u{vmOm0?}$f|G{>Qd@6VUst^GeN$} zZ;S8X;p3(`4}_a2ktTm*lLF^Zmd9FQKRnKiQpKUp*QOwRk{x^9J0*KkE@tnj>&bBB z7MXA&x+uwnH?eD}GO{^Y&v3XJujp=U-p77|&K}JfJ(_uJEk^rg`ZVe-GGi-Rd*z4|#vD&eY(m;sm6`z>V1~ zL6~7Gjn zkFat%%471tt>S-$+>lYZri-TEU+pALIt?#%t=?{a{@j-u)mSKGK5>Q1Bbwx;4NO`; z6|KQVDpT{!^5rpYtURW=F1&E@;KsRl7wq&@OIkp=YZjQQuc`3gOYtw2+$``hdehMF zihf_xZ>&04uh$$&?rR_T<bEp2+{xV!OrM;vMHmhQ)vK344xrtjBV`#+Eou#0<-i zgzAJi|K5BrmkB&zzDz(3@G`LlEYXxZd~Ai3rX2rP9sSX*&k{n7@z)fSP%S~4k*Pt>c%;YyLm#5guj&bIEsALiJ7 zjHq|VmOz=0dN_7u8TAf@kp~vHLJf09qn+;*IQ6feSbH@8+&UvvHfBOfStsI9>de~q z3V>R zComH8h?l_s;cxg~e3LcvayAOSd-Y4Oj$MC&QI!P2I1@R7n^(oOoS|R>gGo^kF^XKl z$!f2n5O*SQUfQJWE8L2wgMmmc+@#H_7Pgr^G?2zHT;W&*Cd;Y{xN$oy*%1^L=+*|n zm}Yf-^yi)43?GdjbD2+MAX|k*VFf!jNWrO}Q6D1};%B!asiz zELuyC9idG~U8mQW%BzQBQCt@WEt~biwR;3!*ZkIFA(^dQ)j>GUVO!GK>l}>*VjC+X z>j0#(DnISz;^i&m0NttqD*I^c1zBtVGU>N zu0o+zT}=~w0erie@ga4qf| z_9>=D#Ei4YVyOFjaennpq$3`NdQx4ZDkUA~l83Q)DWT~e*) zTw2@;`X$n5^FxfPkZF}K8R36}%M|0jU8d7N@TDmrfTbJ;80-pq{+KSrPu=9;K>g}* zFmUDH>$1XZFb*J4GENflT+)&)F~{_kt?3qsu2JLo)nI@b5Ac5#%6~R|9T$SFBQ={; zbxLtF{4LdaO0PE-rV!S{QoC_u8t;563V{#6G1FcV=ggf~=Fr9mQ3`+PuS)8+@^gMv z0AwU~f{t_}3S3`yH-OKwRS9J%q)Ft{7k{GzlV_rgFA~80>BsNjxMk^0Ti76&U^6?n zMK9cKh=2d-Rcnl9%OIu=hJm1cD69PXos_#Jo5!tXwefD%5}PfS6XWCA25(Ys%qA_) zkr1S7puBLRTx}SCr)evO91KESx4osPw;d3wzYUNORkndbX~Z86i-#>KM3#5_e*w;8 J(5gMo0{{a&{Xzf$ diff --git a/dist/fabric.require.js b/dist/fabric.require.js index ac86b1cc..faea414c 100644 --- a/dist/fabric.require.js +++ b/dist/fabric.require.js @@ -10127,6 +10127,9 @@ fabric.Image.filters.BaseFilter = fabric.util.createClass({ return object; }, toSVG: function(reviver) { + if (!this.ctx) { + this.ctx = fabric.util.createCanvasElement().getContext("2d"); + } var markup = this._createBaseSVGMarkup(), offsets = this._getSVGLeftTopOffsets(this.ctx), textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft); this._wrapSVGTextAndBg(markup, textAndBg); return reviver ? reviver(markup.join("")) : markup.join(""); diff --git a/src/shapes/text.class.js b/src/shapes/text.class.js index 14fe67ee..8e5224d7 100644 --- a/src/shapes/text.class.js +++ b/src/shapes/text.class.js @@ -918,6 +918,9 @@ * @return {String} svg representation of an instance */ toSVG: function(reviver) { + if (!this.ctx) { + this.ctx = fabric.util.createCanvasElement().getContext('2d'); + } var markup = this._createBaseSVGMarkup(), offsets = this._getSVGLeftTopOffsets(this.ctx), textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft); diff --git a/test/unit/group.js b/test/unit/group.js index 26bb42cb..d05a2236 100644 --- a/test/unit/group.js +++ b/test/unit/group.js @@ -3,7 +3,7 @@ var el = fabric.document.createElement('canvas'); el.width = 600; el.height = 600; - var canvas = this.canvas = fabric.isLikelyNode ? fabric.createCanvasForNode(600, 600, {enableRetinaScaling: false}) : new fabric.Canvas(el); + var canvas = this.canvas = fabric.isLikelyNode ? fabric.createCanvasForNode(600, 600, {enableRetinaScaling: false}) : new fabric.Canvas(el, {enableRetinaScaling: false}); // function _createImageElement() { // return fabric.isLikelyNode ? new (require('canvas').Image)() : fabric.document.createElement('img'); @@ -521,19 +521,19 @@ test('toObject without default values', function() { isTransparent = fabric.util.isTransparent, ctx = canvas.contextContainer; canvas.add(group); - equal(canvas.enableRetinaScaling, false); - equal(isTransparent(ctx, 0, 0, 0), true); - equal(isTransparent(ctx, 1, 1, 0), false); - equal(isTransparent(ctx, 2, 2, 0), false); - equal(isTransparent(ctx, 3, 3, 0), true); - equal(isTransparent(ctx, 4, 4, 0), false); + equal(canvas.enableRetinaScaling, false, 'enable retina scaling is off'); + equal(isTransparent(ctx, 0, 0, 0), true, '0,0 is transparent'); + equal(isTransparent(ctx, 1, 1, 0), false, '1,1 is opaque'); + equal(isTransparent(ctx, 2, 2, 0), false, '2,2 is opaque'); + equal(isTransparent(ctx, 3, 3, 0), true, '3,3 is transparent'); + equal(isTransparent(ctx, 4, 4, 0), false, '4,4 is opaque'); group.transformMatrix = [2, 0, 0, 2, 1, 1]; canvas.renderAll(); - equal(isTransparent(ctx, 0, 0, 0), true); - equal(isTransparent(ctx, 1, 1, 0), true); - equal(isTransparent(ctx, 2, 2, 0), true); - equal(isTransparent(ctx, 3, 3, 0), false); - equal(isTransparent(ctx, 4, 4, 0), false); + equal(isTransparent(ctx, 0, 0, 0), true, '0,0 is transparent'); + equal(isTransparent(ctx, 1, 1, 0), true, '1,1 is transparent'); + equal(isTransparent(ctx, 2, 2, 0), true, '2,2 is transparent'); + equal(isTransparent(ctx, 3, 3, 0), false, '3,3 is opaque'); + equal(isTransparent(ctx, 4, 4, 0), false, '4,4 is opaque'); }); // asyncTest('cloning group with image', function() { // var rect = new fabric.Rect({ top: 100, left: 100, width: 30, height: 10 }), diff --git a/test/unit/image.js b/test/unit/image.js index eb2e1ecc..b4486b76 100644 --- a/test/unit/image.js +++ b/test/unit/image.js @@ -12,8 +12,7 @@ var IMG_SRC = fabric.isLikelyNode ? (__dirname + '/../fixtures/test_image.gif') : getAbsolutePath('../fixtures/test_image.gif'), IMG_WIDTH = 276, - IMG_HEIGHT = 110, - Canvas = require('canvas'); + IMG_HEIGHT = 110; var REFERENCE_IMG_OBJECT = { 'type': 'image', @@ -55,17 +54,24 @@ }; function _createImageElement() { - return fabric.isLikelyNode ? new Canvas.Image() : fabric.document.createElement('img'); + return fabric.isLikelyNode ? new (require('canvas').Image)() : fabric.document.createElement('img'); } function _createImageObject(width, height, callback, options) { var elImage = _createImageElement(); setSrc(elImage, IMG_SRC, function() { if (width != elImage.width || height != elImage.height) { - var canvas = new Canvas(width, height); - canvas.getContext('2d').drawImage(elImage, 0, 0, width, height); - elImage._src = canvas.toDataURL(); - elImage.src = elImage._src; + if (fabric.isLikelyNode) { + var Canvas = require('canvas'); + var canvas = new Canvas(width, height); + canvas.getContext('2d').drawImage(elImage, 0, 0, width, height); + elImage._src = canvas.toDataURL(); + elImage.src = elImage._src; + } + else { + elImage.width = width; + elImage.height = height; + } return new fabric.Image(elImage, options, callback); } else { @@ -275,9 +281,9 @@ asyncTest('cloneWidthHeight', function() { createSmallImageObject(function(image) { image.clone(function(clone) { - equal(clone.getElement().width, IMG_WIDTH / 2, + equal(clone.width, IMG_WIDTH / 2, 'clone\'s element should have width identical to that of original image'); - equal(clone.getElement().height, IMG_HEIGHT / 2, + equal(clone.height, IMG_HEIGHT / 2, 'clone\'s element should have height identical to that of original image'); start(); }); diff --git a/test/unit/itext.js b/test/unit/itext.js index 07af63f1..2738ddbd 100644 --- a/test/unit/itext.js +++ b/test/unit/itext.js @@ -713,7 +713,7 @@ }); test('toSVG', function() { - var iText = new fabric.IText('test foo bar-baz\nqux', { + var iText = new fabric.IText('test', { styles: { 0: { 0: { fill: '#112233' }, @@ -724,10 +724,8 @@ equal(typeof iText.toSVG, 'function'); - // because translate values differ - if (!fabric.isLikelyNode) { - equal(iText.toSVG(), '\t\n\t\ttest foo bar-bazqux\n\t\n'); - } + equal(iText.toSVG(), '\t\n\t\t\n\t\t\tt\n\t\t\te\n\t\t\ts\n\t\t\tt\n\t\t\n\t\n'); + // TODO: more SVG tests here? }); @@ -749,11 +747,17 @@ }; canvas.add(iText); equal(typeof iText.toSVG, 'function'); - - // because translate values differ - if (!fabric.isLikelyNode) { - equal(canvas.toSVG(), '\t\n\t\ttest foo bar-bazqux\n\t\n'); + var parser; + if (fabric.isLikelyNode) { + var XmlDomParser = require('xmldom').DOMParser; + parser = new XmlDomParser(); } + else { + parser = new DOMParser(); + } + var svgString = canvas.toSVG(), + doc = parser.parseFromString(svgString, "image/svg+xml"), + style = doc.getElementsByTagName('style')[0].firstChild.data; + equal(style, '\n\t\t@font-face {\n\t\t\tfont-family: \'Plaster\';\n\t\t\tsrc: url(\'path-to-plaster-font-file\');\n\t\t}\n\t\t@font-face {\n\t\t\tfont-family: \'Engagement\';\n\t\t\tsrc: url(\'path-to-engagement-font-file\');\n\t\t}\n'); }); - })(); diff --git a/test/unit/text.js b/test/unit/text.js index 2450bef8..9606a279 100644 --- a/test/unit/text.js +++ b/test/unit/text.js @@ -76,7 +76,13 @@ ok(typeof text._getFontDeclaration == 'function', 'has a private method _getFontDeclaration'); var fontDecl = text._getFontDeclaration(); ok(typeof fontDecl == 'string', 'it returns a string'); - equal(fontDecl, 'normal 40px "Times New Roman"'); + if (fabric.isLikelyNode) { + equal(fontDecl, 'normal 40px "Times New Roman"'); + } + else { + equal(fontDecl, ' normal 40px "Times New Roman"'); + } + }); test('toObject', function() {