{"version":3,"sources":["webpack:///./node_modules/core-js/internals/to-index.js","webpack:///./node_modules/core-js/internals/typed-array-from-species-and-list.js","webpack:///./node_modules/core-js/internals/array-copy-within.js","webpack:///../../../src/components/VOverlay/VOverlay.ts","webpack:///../../../src/components/VOverlay/index.ts","webpack:///../../../src/mixins/overlayable/index.ts","webpack:///../../../src/components/VDialog/VDialog.ts","webpack:///./node_modules/core-js/modules/es.typed-array.subarray.js","webpack:///./node_modules/core-js/internals/to-offset.js","webpack:///./node_modules/core-js/modules/es.typed-array.sort.js","webpack:///./node_modules/core-js/modules/es.typed-array.reduce-right.js","webpack:///./node_modules/core-js/modules/es.typed-array.slice.js","webpack:///./src/views/pest_control/PestIdentifyCameraPage.vue?d8da","webpack:///./src/components/layout/DialogDeleteConfirm.vue?ee6b","webpack:///src/components/layout/DialogDeleteConfirm.vue","webpack:///./src/components/layout/DialogDeleteConfirm.vue?1b35","webpack:///./src/components/layout/DialogDeleteConfirm.vue","webpack:///./src/views/pest_control/AddressAddPage.vue?dd02","webpack:///src/views/pest_control/AddressAddPage.vue","webpack:///./src/views/pest_control/AddressAddPage.vue?9b72","webpack:///./src/views/pest_control/AddressAddPage.vue","webpack:///./node_modules/vue-image-markup/src/Editor.vue?0202","webpack:///./node_modules/vue-image-markup/src/assets/js/canvasHistory.js","webpack:///./node_modules/vue-image-markup/src/assets/js/shape.js","webpack:///./node_modules/vue-image-markup/src/assets/js/text.js","webpack:///./node_modules/vue-image-markup/src/assets/js/arrow.js","webpack:///./node_modules/vue-image-markup/src/assets/js/crop.js","webpack:///node_modules/vue-image-markup/src/Editor.vue","webpack:///./node_modules/vue-image-markup/src/Editor.vue?2003","webpack:///./node_modules/vue-image-markup/src/Editor.vue","webpack:///src/views/pest_control/PestIdentifyCameraPage.vue","webpack:///./src/views/pest_control/PestIdentifyCameraPage.vue?f57c","webpack:///./src/views/pest_control/PestIdentifyCameraPage.vue","webpack:///./node_modules/core-js/modules/es.typed-array.last-index-of.js","webpack:///./src/views/pest_control/PestIdentifyCameraPage.vue?0b39","webpack:///./node_modules/core-js/modules/es.typed-array.find-index.js","webpack:///./src/components/form-element/InputAddress.vue?a440","webpack:///src/components/form-element/InputAddress.vue","webpack:///./src/components/form-element/InputAddress.vue?7fc6","webpack:///./src/components/form-element/InputAddress.vue","webpack:///./node_modules/core-js/modules/es.typed-array.set.js","webpack:///./node_modules/vue-image-markup/src/Editor.vue?b9f2","webpack:///./node_modules/core-js/modules/es.typed-array.map.js","webpack:///./src/views/pest_control/PestIdentifyNote.vue?f2ae","webpack:///src/views/pest_control/PestIdentifyNote.vue","webpack:///./src/views/pest_control/PestIdentifyNote.vue?382d","webpack:///./src/views/pest_control/PestIdentifyNote.vue","webpack:///./src/components/form-element/InputUploadButton.vue?637e","webpack:///src/components/form-element/InputUploadButton.vue","webpack:///./src/components/form-element/InputUploadButton.vue?c680","webpack:///./src/components/form-element/InputUploadButton.vue","webpack:///../../../src/components/VForm/VForm.ts","webpack:///../../../src/mixins/rippleable/index.ts","webpack:///./node_modules/core-js/modules/es.typed-array.uint8-array.js","webpack:///./node_modules/core-js/modules/es.typed-array.join.js","webpack:///./node_modules/core-js/modules/es.typed-array.iterator.js","webpack:///./node_modules/core-js/internals/array-buffer.js","webpack:///./node_modules/core-js/modules/es.typed-array.some.js","webpack:///./node_modules/core-js/modules/es.typed-array.to-string.js","webpack:///./node_modules/core-js/modules/es.typed-array.fill.js","webpack:///./node_modules/core-js/internals/typed-array-constructor.js","webpack:///./node_modules/core-js/internals/ieee754.js","webpack:///./node_modules/fabric/dist/fabric.js","webpack:///./node_modules/core-js/modules/es.typed-array.includes.js","webpack:///../../../src/mixins/comparable/index.ts","webpack:///./node_modules/core-js/internals/typed-array-constructors-require-wrappers.js","webpack:///../../../src/components/VCard/index.ts","webpack:///./node_modules/core-js/modules/es.typed-array.copy-within.js","webpack:///./node_modules/core-js/internals/typed-array-from.js","webpack:///./node_modules/core-js/modules/es.typed-array.every.js","webpack:///./node_modules/core-js/internals/array-buffer-native.js","webpack:///../../../src/components/VCheckbox/VCheckbox.ts","webpack:///../../../src/components/VCard/VCard.ts","webpack:///./node_modules/core-js/modules/es.typed-array.to-locale-string.js","webpack:///../../../src/mixins/applicationable/index.ts","webpack:///../../../src/mixins/button-group/index.ts","webpack:///../../../src/directives/scroll/index.ts","webpack:///../../../src/mixins/scrollable/index.ts","webpack:///../../../src/components/VBottomNavigation/VBottomNavigation.ts","webpack:///./node_modules/core-js/modules/web.url.to-json.js","webpack:///./node_modules/core-js/modules/es.typed-array.filter.js","webpack:///./src/components/form-element/InputUploadButton.vue?6ec2","webpack:///./node_modules/core-js/modules/es.typed-array.reduce.js","webpack:///./node_modules/core-js/modules/es.typed-array.reverse.js","webpack:///../../../src/components/VDivider/VDivider.ts","webpack:///./node_modules/core-js/modules/es.typed-array.find.js","webpack:///./node_modules/core-js/internals/array-reduce.js","webpack:///./node_modules/core-js/modules/es.typed-array.for-each.js","webpack:///./node_modules/core-js/internals/array-last-index-of.js","webpack:///./node_modules/core-js/modules/es.typed-array.index-of.js","webpack:///./node_modules/core-js/internals/array-buffer-view-core.js","webpack:///./node_modules/core-js/internals/to-positive-integer.js","webpack:///../../../src/mixins/selectable/index.ts"],"names":["toInteger","toLength","module","exports","it","undefined","number","length","RangeError","aTypedArrayConstructor","speciesConstructor","instance","list","C","constructor","index","result","toObject","toAbsoluteIndex","min","Math","copyWithin","target","start","O","this","len","to","from","end","arguments","count","inc","mixins","name","props","absolute","color","type","default","dark","opacity","Number","value","zIndex","computed","__scrim","data","setBackgroundColor","staticClass","style","computedOpacity","$createElement","classes","themeClasses","isActive","styles","methods","genContent","$slots","render","children","h","class","hideOverlay","overlayColor","overlayOpacity","String","animationFrame","overlay","watch","genOverlay","beforeDestroy","createOverlay","propsData","parent","$el","document","requestAnimationFrame","removeOverlay","showScroll","cancelAnimationFrame","scrollListener","e","includes","up","down","checkPath","hasScrollbar","el","Node","window","shouldScroll","delta","isInside","path","composedPath","dialog","$refs","selected","hideScroll","$vuetify","breakpoint","passive","baseMixins","directives","ClickOutside","disabled","fullscreen","light","maxWidth","noClickAnimation","origin","persistent","retainFocus","scrollable","transition","width","activatedBy","animate","animateTimeout","stackMinZIndex","previousActiveElement","contentClasses","hasActivator","Boolean","$scopedSlots","created","$attrs","hasOwnProperty","beforeMount","unbind","animateClick","closeConditional","_isDestroyed","content","contains","activeZIndex","show","bind","onClickOutside","onKeydown","getOpenDependents","activator","onFocusin","getOpenDependentElements","some","focusable","querySelectorAll","showLazyContent","root","attrs","role","tabindex","on","keydown","ref","genTransition","appear","genInnerContent","handler","include","transformOrigin","attach","ArrayBufferViewCore","aTypedArray","exportTypedArrayMethod","begin","beginIndex","buffer","byteOffset","BYTES_PER_ELEMENT","toPositiveInteger","BYTES","offset","$sort","sort","comparefn","call","$reduceRight","right","callbackfn","fails","$slice","slice","FORCED","Int8Array","_vm","_h","_c","_self","fluid","scopedSlots","_u","key","fn","_g","_b","colorFill","cameraLayer","_v","_l","item","$event","handleAction","action","_s","icon","text","setColor","handleTrash","uploadLabel","handleUpload","staticStyle","canvasWidth","canvasHeight","handleOpenCamera","_e","handleSubmit","img","handleDelete","images","handleNext","dialogPestNote","source","handleClose","submitPest","modalConfirm","handleCloseConfirm","dialogAddress","handleCloseAddress","staticRenderFns","model","callback","$$v","dialogConfirm","expression","loading","handleConfirm","component","VBtn","VCard","VCardActions","VCardText","VDialog","VRow","VSpacer","defaultValue","addressSelected","requiredRules","address","$set","rawName","VCardTitle","VCheckbox","VCol","VForm","VIcon","VTextField","editorId","history","CanvasHistory","canvas","cropObject","redoHistory","backgroundImage","push","currentCanvas","toJSON","objects","forEach","object","heads","currentJson","Object","assign","json","drag","shape","lineWidth","fillCircle","angle","shapeId","strokeDashArray","borderRadius","properties","isDown","Shape","draggable","params","stroke","fill","strokeWidth","id","className","isDrawing","origX","origY","bindEvents","prototype","inst","onkeydown","which","keycode","getActiveObjects","obj","remove","renderAll","selectable","off","o","onMouseDown","onMouseMove","onMouseUp","disable","isEnable","getObjects","array","getActiveObject","_objects","setActiveObject","hasControls","hasBorders","lockMovementX","lockMovementY","lockUniScaling","canvasProperties","height","selection","activeObj","pointer","getPointer","noScaleCache","strokeUniform","x","set","left","abs","y","top","scaleX","scaleY","x2","y2","rx","ry","setCoords","enable","rect","fabric","Rect","originX","originY","transparentCorners","add","comment","Path","circle","Ellipse","points","line","Line","textColor","textFontFamily","textFontSize","customText","textFontStyle","textFontWeight","textId","activeObject","Text","fontFamily","fontSize","fontStyle","fontWeight","placeholder","evented","IText","selectionStart","selectionEnd","enterEditing","hiddenTextarea","focus","requestRenderAll","LineArrow","util","createClass","initialize","element","options","callSuper","extend","_render","ctx","p","calcLinePoints","xDiff","x1","yDiff","y1","atan2","drawArrow","save","xPos","yPos","head","translate","rotate","beginPath","moveTo","lineTo","closePath","fillStyle","restore","fromObject","async","fillArrow","arrowId","Arrow","dirty","objectCaching","perPixelTargetFind","bgImage","src","rectRed","cropperWidth","cropperHeight","clip","clipOverlay","CropImage","apply","cancel","backgroundColor","image","clear","Promise","resolve","loadImage","Image","setBackgroundImage","setHeight","setWidth","calcOffset","toDataURL","then","croppedImage","imagePosition","uniScaleTransform","fromURL","oImg","imageWidth","imageHeight","cornerSize","borderColor","cornerColor","cornerStyle","hasRotatingPoint","JSON","parse","clipTo","context","strokeStyle","strokeColor","setControlsVisibility","tl","mt","tr","ml","mr","bl","mb","br","bringToFront","bottom","newClip","updatedPath","event","VBottomNavigation","VContainer","VImg","VList","VListItem","VListItemTitle","VMenu","$lastIndexOf","searchElement","$findIndex","findIndex","predicate","handleBlur","getAddressData","toOffset","arrayLike","$map","map","mapfn","note","VDivider","VTextarea","iconCamera","buttonTitle","fileChanged","provide","form","inheritAttrs","lazyValidation","readonly","inputs","watchers","errorBag","errors","deep","immediate","watchInput","watcher","input","val","_uid","valid","shouldValidate","validate","filter","reset","resetErrorBag","setTimeout","resetValidation","register","unregister","found","find","i","unwatch","novalidate","attrs$","submit","ripple","genRipple","center","createTypedArrayConstructor","init","$join","join","separator","global","ArrayIterators","wellKnownSymbol","ITERATOR","Uint8Array","arrayValues","values","arrayKeys","keys","arrayEntries","entries","nativeTypedArrayIterator","CORRECT_ITER_NAME","typedArrayValues","DESCRIPTORS","NATIVE_ARRAY_BUFFER","createNonEnumerableProperty","redefineAll","anInstance","toIndex","IEEE754","getPrototypeOf","setPrototypeOf","getOwnPropertyNames","f","defineProperty","arrayFill","setToStringTag","InternalStateModule","getInternalState","get","setInternalState","ARRAY_BUFFER","DATA_VIEW","PROTOTYPE","WRONG_LENGTH","WRONG_INDEX","NativeArrayBuffer","$ArrayBuffer","$DataView","$DataViewPrototype","ObjectPrototype","packIEEE754","pack","unpackIEEE754","unpack","packInt8","packInt16","packInt32","unpackInt32","packFloat32","packFloat64","addGetter","Constructor","view","isLittleEndian","intIndex","store","byteLength","bytes","reverse","conversion","NaN","ArrayBufferPrototype","j","testView","$setInt8","setInt8","getInt8","setUint8","unsafe","Array","bufferLength","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","ArrayBuffer","DataView","$some","Uint8ArrayPrototype","arrayToString","toString","arrayJoin","IS_NOT_ARRAY_METHOD","$fill","$","TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS","ArrayBufferModule","createPropertyDescriptor","toPrimitive","has","classof","isObject","create","typedArrayFrom","setSpecies","definePropertyModule","getOwnPropertyDescriptorModule","inheritIfRequired","nativeDefineProperty","nativeGetOwnPropertyDescriptor","round","NATIVE_ARRAY_BUFFER_VIEWS","TYPED_ARRAY_TAG","TypedArray","TypedArrayPrototype","isTypedArray","fromList","isArrayBuffer","klass","isTypedArrayIndex","wrappedGetOwnPropertyDescriptor","wrappedDefineProperty","descriptor","configurable","writable","enumerable","stat","forced","getOwnPropertyDescriptor","TYPE","wrapper","CLAMPED","match","CONSTRUCTOR_NAME","GETTER","SETTER","NativeTypedArrayConstructor","TypedArrayConstructor","TypedArrayConstructorPrototype","exported","getter","that","setter","addElement","dummy","typedArrayOffset","$length","$len","sham","pow","floor","log","LN2","mantissaLength","exponent","mantissa","c","exponentLength","eMax","eBias","rt","sign","Infinity","nBits","version","HTMLDocument","Document","implementation","createHTMLDocument","jsdom","virtualWindow","JSDOM","decodeURIComponent","features","FetchExternalResources","resources","jsdomImplForWrapper","implForWrapper","nodeCanvas","Canvas","DOMParser","resizeCanvasIfNeeded","pipelineState","targetCanvas","dWidth","destinationWidth","dHeight","destinationHeight","copyGLTo2DDrawImage","gl","glCanvas","getContext","scale","sourceY","drawImage","copyGLTo2DPutImageData","numBytes","u8","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","RGBA","UNSIGNED_BYTE","imgData","ImageData","putImageData","isTouchSupported","navigator","maxTouchPoints","isLikelyNode","Buffer","SHARED_ATTRIBUTES","DPI","reNum","fontPaths","iMatrix","perfLimitSizeTotal","maxCacheSideLimit","minCacheSideLimit","charWidthsCache","textureSize","disableStyleCopyPaste","enableGLFiltering","devicePixelRatio","webkitDevicePixelRatio","mozDevicePixelRatio","browserShadowBlurConstant","arcToSegmentsCache","boundsOfCurveCache","cachesBoundsOfCurve","forceGLPutImageData","initFilterBackend","isWebglSupported","console","maxTextureSize","WebglFilterBackend","tileSize","Canvas2dFilterBackend","_removeEventListener","eventName","__eventListeners","eventListener","indexOf","observe","prop","stopObserving","fire","listenersForEvent","Observable","trigger","Collection","_onObjectAdded","renderOnAddRemove","insertAt","nonSplicing","splice","somethingRemoved","_onObjectRemoved","forEachObject","concat","isEmpty","size","complexity","reduce","memo","current","CommonMethods","_setOptions","_initGradient","filler","property","colorStops","Gradient","_initPattern","Pattern","_initClipping","functionBody","getFunctionBody","Function","_setObject","_set","toggle","sqrt","PiBy180","PI","PiBy2","cos","angleSlice","sin","removeFromArray","idx","getRandomInt","max","random","degreesToRadians","degrees","radiansToDegrees","radians","rotatePoint","point","subtractEquals","v","rotateVector","Point","addEquals","vector","transformPoint","t","ignoreOffset","makeBoundingBoxFromPoints","transform","xPoints","minX","maxX","yPoints","minY","maxY","invertTransform","a","r","toFixed","fractionDigits","parseFloat","parseUnit","unit","exec","DEFAULT_SVG_FONT_SIZE","falseFunction","getKlass","namespace","string","camelize","charAt","toUpperCase","resolveNamespace","getSvgAttributes","attributes","parts","split","url","crossOrigin","createImage","onLoadCallback","onload","onerror","substring","loadImageInDom","div","createElement","position","appendChild","querySelector","parentNode","removeChild","enlivenObjects","reviver","enlivenedObjects","numLoadedObjects","numTotalObjects","onLoaded","error","enlivenPatterns","patterns","numLoadedPatterns","numPatterns","enlivenedPatterns","pattern","groupSVGElements","elements","centerPoint","Group","sourcePath","populateWithProperties","destination","drawDashedLine","da","dx","dy","rot","dc","di","draw","createCanvasElement","copyCanvasElement","newCanvas","canvasEl","format","quality","clipContext","receiver","multiplyTransformMatrices","b","is2x2","qrDecompose","denom","skewX","skewY","translateX","translateY","calcRotateMatrix","theta","calcDimensionsMatrix","scaleMatrix","flipX","flipY","multiply","tan","composeMatrix","matrix","customTransformMatrix","resetObjectTransform","saveObjectTransform","isTransparent","tolerance","temp","_isTransparent","imageData","getImageData","l","parsePreserveAspectRatioAttribute","attribute","align","meetOrSlice","alignX","alignY","aspectRatioAttrs","pop","clearFabricFontCache","toLowerCase","limitDimsByArea","ar","maximumArea","roughWidth","perfLimitSizeY","capValue","findScaleToFit","findScaleToCover","matrixToSVG","NUM_FRACTION_DIGITS","_join","arcToSegments","toX","toY","large","sweep","rotateX","argsString","th","sinTh","cosTh","fromX","fromY","px","py","rx2","ry2","py2","px2","pl","s","cx","cy","cx1","cy1","mTheta","calcVectorAngle","dtheta","segments","ceil","mDelta","mT","th3","segmentToBezier","th2","costh2","sinth2","costh3","sinth3","cp1X","cp1Y","cp2X","cp2Y","ux","uy","vx","vy","ta","tb","getBoundsOfCurve","x0","y0","x3","y3","t1","t2","b2ac","sqrtb2ac","tvalues","bounds","jlen","drawArc","fx","fy","coords","tx","ty","segs","segsNorm","bezierCurveTo","getBoundsOfArc","bound","invoke","method","args","byProperty","value1","value2","k","condition","Element","clone","replace","character","capitalize","firstLetterOnly","escapeXml","graphemeSplit","textstring","chr","graphemes","getWholeChar","str","code","charCodeAt","isNaN","next","prev","emptyFunction","IS_DONTENUM_BUGGY","addMethods","superclass","returnValue","valueOf","Subclass","methodName","parentMethod","_this","superClassMethod","shift","subclasses","couldUseAttachEvent","attachEvent","getTouchInfo","touchProp","changedTouches","addListener","addEventListener","removeListener","removeEventListener","scroll","getScrollLeftTop","_evt","clientX","clientY","setStyle","elementStyle","cssText","setOpacity","normalizedProperty","styleFloat","parseEl","supportsOpacity","supportsFilters","reOpacity","es","currentStyle","hasLayout","zoom","test","_slice","getById","getElementById","sliceCanConvertNodelists","getElementStyle","toArray","childNodes","err","makeElement","tagName","htmlFor","setAttribute","addClass","wrapElement","replaceChild","docElement","documentElement","body","scrollLeft","scrollTop","host","nodeType","getElementOffset","docElem","scrollLeftTop","doc","ownerDocument","box","offsetAttributes","borderLeftWidth","borderTopWidth","paddingLeft","paddingTop","attr","parseInt","getBoundingClientRect","clientLeft","clientTop","getNodeCanvas","impl","_canvas","_image","cleanUpJsdomNode","_currentSrc","_attributes","_classList","arr","defaultView","getComputedStyle","selectProp","makeElementUnselectable","onselectstart","unselectable","makeElementSelectable","getScript","headEl","getElementsByTagName","scriptEl","onreadystatechange","readyState","addParamToUrl","param","emptyFn","request","onComplete","xhr","XMLHttpRequest","parameters","open","setRequestHeader","send","warn","noop","defaultEasing","d","requestAnimFrame","timestamp","time","Date","duration","finish","onChange","abort","easing","startValue","endValue","byValue","onStart","tick","ticktime","currentTime","timePerc","valuePerc","_requestAnimFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","_cancelAnimFrame","clearTimeout","cancelAnimFrame","calculateColor","pos","animateColor","fromColor","toColor","startColor","Color","getSource","endColor","posValue","colorEasing","normalize","asin","elastic","opts","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","ease","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","svgValidTagNames","svgViewBoxElements","svgInvalidAncestors","svgValidParents","attributesMap","display","visibility","colorAttributes","normalizeAttr","normalizeValue","parentAttributes","parsed","isArray","transformMatrix","parseTransformAttribute","visible","fillIndex","strokeIndex","getSvgRegex","RegExp","_setStrokeFillOpacity","setAlpha","getAlpha","toRgba","_getMultipleNodes","nodeNames","nodeName","nodeList","nodeArray","parseStyleString","oStyle","chunk","pair","trim","parseStyleObject","getGlobalStylesForElement","svgUid","rule","cssRules","elementMatchesRule","selectors","firstMatching","parentMatching","selectorMatches","doesSomeParentMatch","selector","matcher","classNames","getAttribute","elementById","node","nodelist","parseUseDirectives","xlink","substr","el2","cloneNode","currentTrans","oldLength","applyViewboxTransform","el3","nodeValue","firstChild","removeAttribute","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgInvalidAncestorsRegEx","svgValidParentsRegEx","gradientDefs","clipPaths","rotateMatrix","multiplierX","multiplierY","skewMatrix","translateMatrix","commaWsp","transforms","transformList","reTransformList","reTransform","attributeValue","matrices","m","operation","combinedMatrix","reViewBoxAttrValue","viewBoxWidth","viewBoxHeight","viewBoxAttr","widthAttr","heightAttr","preserveAspectRatio","missingViewBox","missingDimAttr","toBeParsed","parsedDim","widthDiff","heightDiff","viewboxTransform","hasAncestorWithNodeName","recursivelyParseGradientsXlink","gradient","gradientsAttrs","xlinkAttr","xLink","referencedGradient","hasAttribute","referenceClone","parseSVGDocument","parsingOptions","__uid","descendants","selectNodes","getGradientDefs","getCSSRules","parseElements","instances","reFontDeclaration","parseFontDeclaration","lineHeight","tagArray","elList","parseAttributes","parentFontSize","ownAttributes","parseStyleAttribute","normalizedAttr","normalizedValue","normalizedStyle","font","mergedAttrs","ElementsParser","parsePointsAttribute","parsedPoints","rules","allRules","styleContents","textContent","ruleObj","declaration","propertyValuePairs","_rule","loadSVGFromURL","xml","responseXML","ActiveXObject","responseText","loadXML","results","_options","allElements","loadSVGFromString","parser","parseFromString","regexUrl","proto","numElements","createObjects","createObject","findTag","fromElement","createCallback","checkIfDone","resolveGradient","_originalElement","_removeTransformMatrix","resolveClipPath","extractPropertyDefinition","storage","lastIndex","gradientDef","opacityAttr","createClipPathCallback","container","_newObj","fillRule","clipRule","objTransformInv","gTransform","clipPath","calcTransformMatrix","setPositionByOrigin","scalarAdd","scalar","scalarAddEquals","subtract","scalarSubtract","scalarSubtractEquals","multiplyEquals","divide","divideEquals","eq","lt","lte","gt","gte","lerp","distanceFrom","midPointFrom","setXY","setX","setY","setFromPoint","swap","Intersection","status","appendPoint","appendPoints","intersectLineLine","a1","a2","b1","b2","uaT","ubT","uB","ua","ub","intersectLinePolygon","inter","intersectPolygonPolygon","points1","points2","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","_tryParsingColor","setSource","hue2rgb","q","colorNameMap","sourceFromHex","sourceFromRgb","sourceFromHsl","_rgbToHsl","g","_source","toRgb","toHsl","hsl","toHsla","toHex","toHexa","alpha","toGrayscale","average","currentAlpha","toBlackWhite","threshold","overlayWith","otherColor","otherAlpha","otherSource","reRGBa","reHSLa","reHex","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","fromRgb","fromSource","fromRgba","fromHsl","fromHsla","fromHex","isShortNotation","isRGBa","oColor","getColorStop","multiplier","colorAlpha","keyValuePairs","getLinearCoords","getRadialCoords","__convertPercentUnitsToValues","svgOptions","gradientUnits","propValue","finalValue","offsetX","offsetY","gradientTransform","option","addColorStop","propertiesToInclude","toSVG","markup","commonAttributes","needsSwap","withViewport","additionalTransform","pathOffset","minRadius","maxRadius","percentageShift","colorStop","toLive","createLinearGradient","createRadialGradient","colorStopEls","forObject","repeat","patternTransform","setOptions","patternSource","patternWidth","patternHeight","patternOffsetX","patternOffsetY","patternImgSrc","complete","naturalWidth","naturalHeight","createPattern","Shadow","blur","affectStroke","includeDefaultValues","nonScaling","_parseShadow","shadow","shadowStr","offsetsAndBlur","reOffsetsAndBlur","fBoxX","fBoxY","BLUR_BOX","StaticCanvas","CANVAS_INIT_ERROR","Error","renderAndResetBound","renderAndReset","requestRenderAllBound","_initStatic","overlayImage","stateful","controlsAboveOverlay","allowTouchScrolling","imageSmoothingEnabled","viewportTransform","backgroundVpt","overlayVpt","onBeforeScaleRotate","enableRetinaScaling","vptCoords","skipOffscreen","cb","_createLowerCanvas","_initOptions","_setImageSmoothing","interactive","_initRetinaScaling","setOverlayImage","setOverlayColor","_isRetinaScaling","getRetinaScaling","lowerCanvasEl","contextContainer","_offset","__setBgOverlayImage","__setBgOverlayColor","webkitImageSmoothingEnabled","mozImageSmoothingEnabled","msImageSmoothingEnabled","oImageSmoothingEnabled","_createCanvasElement","_applyCanvasStyle","getWidth","getHeight","setDimensions","dimensions","cssValue","cssOnly","_setBackstoreDimension","hasLostContext","backstoreOnly","_setCssDimension","_isCurrentlyDrawing","freeDrawingBrush","_setBrushStyles","upperCanvasEl","cacheCanvasEl","wrapperEl","getZoom","setViewportTransform","vpt","_activeObject","ignoreVpt","skipAbsolute","group","calcViewportBoundaries","zoomToPoint","before","after","setZoom","absolutePan","relativePan","getElement","setupState","clearContext","clearRect","_hasITextHandlers","_mouseUpITextHandler","_iTextInstances","canvasToDrawOn","renderCanvas","isRendering","iVpt","cancelRequestedRender","_renderBackground","_renderObjects","drawControls","shouldCache","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","_renderBackgroundOrOverlay","needsVpt","getCenter","centerObjectH","_centerObject","getCenterPoint","centerObjectV","centerObject","viewportCenterObject","vpCenter","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","toDatalessJSON","toDatalessObject","_toObjectMethod","_toObjects","_toObject","__serializeBgOverlay","excludeFromExport","originalValue","background","svgViewportTransformation","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","viewBox","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","row","rowIndex","_char","charIndex","fontList","_setSVGObject","finalWidth","finalHeight","shouldInvert","sendToBack","objs","activeSelection","unshift","sendBackwards","intersecting","newIdx","objsMoved","_findNewLowerIndex","isIntersecting","intersectsWithObject","isContainedWithinObject","bringForward","_findNewUpperIndex","dispose","DataURLExporter","EMPTY_JSON","supports","setLineDash","createPNGStream","createJPEGStream","BaseBrush","strokeLineCap","strokeLineJoin","strokeMiterLimit","setShadow","contextTop","lineCap","miterLimit","lineJoin","_saveAndTransform","_setShadow","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","needsFullRender","_resetShadow","PencilBrush","decimate","_points","_drawSegment","p1","p2","midPoint","quadraticCurveTo","_isMainEvent","_prepareForDrawing","_captureDrawingPath","oldEnd","_finalizeAndAddPath","_reset","_addPoint","pointerPoint","convertPointsToSVGPath","multSignX","multSignY","manyPoints","createPath","pathData","decimatePoints","distance","cDistance","adjustedDistance","lastPoint","newPoints","CircleBrush","drawDot","addPoint","dot","arc","radius","originalRenderOnAddRemove","circles","Circle","circleRadius","circleColor","SprayBrush","density","dotWidth","dotWidthVariance","randomOpacity","optimizeOverlapping","sprayChunks","addSprayChunk","sprayChunkPoints","rects","ilen","sprayChunk","_getOptimizedRects","uniqueRects","uniqueRectsArray","globalAlpha","fillRect","PatternBrush","getPatternSrc","dotDistance","patternCanvas","patternCtx","getPatternSrcFunction","getPattern","topLeft","_getLeftTopCoords","supportLineDash","STROKE_OFFSET","_initInteractive","_createCacheCanvas","uniScaleKey","centeredScaling","centeredRotation","centeredKey","altActionKey","selectionKey","altSelectionKey","selectionColor","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","hoverCursor","moveCursor","defaultCursor","freeDrawingCursor","rotationCursor","notAllowedCursor","containerClass","targetFindTolerance","skipTargetFind","isDrawingMode","preserveObjectStacking","snapAngle","snapThreshold","stopContextMenu","fireRightClick","fireMiddleClick","_currentTransform","_groupSelector","_initWrapperElement","_createUpperCanvas","_initEventListeners","_chooseObjectsToRender","objsToRender","activeGroupObjects","activeObjects","contextTopDirty","renderTopLayer","_drawSelection","renderTop","_resetCurrentTransform","original","_shouldCenterTransform","mouseXSign","mouseYSign","containsPoint","xy","ignoreZoom","_normalizePointer","_findTargetCorner","invertedM","vptPointer","restorePointerVpt","isTargetTransparent","normalizedPointer","targetRelativeX","targetRelativeY","_cacheContext","contextCache","originalColor","selectionBackgroundColor","_renderControls","_isSelectionKeyPressed","selectionKeyPressed","_shouldClearSelection","centerTransform","altKey","_getOriginFromCorner","corner","_getActionFromCorner","alreadySelected","_setupCurrentTransform","ex","ey","lastX","lastY","shiftKey","_beforeTransform","_translateObject","newLeft","newTop","moveX","moveY","_changeSkewTransformOrigin","mouseMove","by","origins","0","skew","originA","originB","flipSign","skewSign","_skewObject","skewed","lockSkewingX","lockSkewingY","actualMouseByOrigin","constraintPosition","actualMouseByCenter","toLocalPoint","lastMouseByCenter","dim","_getTransformedDimensions","translateToOriginPoint","_setObjectSkew","localMouse","_dim","newValue","newDim","dimNoSkew","otherBy","_otherBy","_by","newDimMouse","atan","_scaleObject","lockScalingX","lockScalingY","lockScalingFlip","scaled","_setLocalMouse","_setObjectScale","forbidScalingX","forbidScalingY","changeX","changeY","newScaleX","newScaleY","Textbox","w","getMinWidth","_scaleObjectEqually","_flipObject","dist","lastDist","signX","signY","padding","_rotateObject","lockRotation","lastAngle","curAngle","hasRotated","rightAngleLocked","leftAngleLocked","setCursor","cursor","groupSelector","aleft","atop","_setLineDash","strokeRect","findTarget","skipGroup","activeTarget","activeTargetSubs","aObjects","targets","_searchPossibleTargets","_checkTarget","globalPointer","isEditing","subTarget","objToCheck","pointerToUse","subTargetCheck","_absolutePointer","_pointer","cssScale","boundsWidth","boundsHeight","lowerCanvasClass","_copyCanvasStyle","fromEl","toEl","getSelectionContext","getSelectionElement","active","_discardActiveObject","_hoveredTarget","_fireSelectionEvents","oldObjects","somethingChanged","added","removed","opt","oldObject","deselected","updated","currentActives","_setActiveObject","onSelect","onDeselect","discardActiveObject","removeListeners","originalProperties","_realizeGroupTransformOnObject","_unwindGroupTransformOnObject","layoutProps","originalValues","realizeTransform","clearContextTop","cursorOffset","RIGHT_CLICK","MIDDLE_CLICK","LEFT_CLICK","addEventOptions","checkClick","button","cursorMap","mainTouchId","_bindEvents","addOrRemove","_getEventPrefix","enablePointerEvents","functor","eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onDoubleClick","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","eventjs","_onGesture","_onDrag","_onOrientationChange","_onShake","_onLongPress","_onMouseUp","_onTouchEnd","eventsBound","_simpleEventHandler","self","__onTransformGesture","__onDrag","__onMouseWheel","currentTransform","__onOrientationChange","__onShake","__onLongPress","preventDefault","_fireEnterLeaveEvents","stopPropagation","_cacheTransformEventData","_handleEvent","_resetTransformEventData","getPointerId","evt","identifier","pointerId","isPrimary","touches","__onMouseDown","__onMouseUp","_willAddMouseDown","__onMouseMove","_shouldRender","shouldRender","isClick","_target","_onMouseUpInDrawingMode","_finalizeCurrentTransform","actionPerformed","_maybeGroupObjects","isMoving","_setCursorFromEvent","__corner","eventType","subTargets","absolutePointer","_scaling","hasStateChanged","_addEventOptions","_fire","_onMouseDownInDrawingMode","_onMouseMoveInDrawingMode","_previousPointer","shouldGroup","_shouldGroup","_handleGrouping","saveState","_transformObject","_fireOverOutEvents","fireSyntheticInOutEvents","targetName","canvasEvtOut","evtOut","canvasEvtIn","evtIn","config","inOpt","outOpt","outFires","inFires","oldTarget","targetChanged","previousTarget","nextTarget","_beforeScaleTransform","_performTransformAction","_onScale","_isUniscalePossible","currentAction","getCornerCursor","actionIsDisabled","_getRotatedCornerCursor","n","_updateActiveSelection","_createActiveSelection","currentActiveObjects","removeWithUpdate","addWithUpdate","_createGroup","isActiveLower","groupObjects","exitEditing","ActiveSelection","_groupSelectedObjects","aGroup","_collectObjects","currentObject","selectionX1Y1","selectionX2Y2","allowIntersect","intersectsWithRect","isContainedWithinRect","toCanvasElement","cropping","scaledWidth","scaledHeight","originalWidth","originalHeight","newZoom","vp","originalInteractive","newVp","originalRetina","originalContextTop","loadFromDatalessJSON","loadFromJSON","serialized","_enlivenObjects","_setBgOverlay","enlivenedCanvasClip","__setupCanvas","loaded","cbIfLoaded","__setBgOverlay","enlivedObject","_toDataURL","_toDataURLWithMultiplier","toDataURLWithMultiplier","stringify","cloneWithoutData","backgroundImageOpacity","backgroundImageStretch","supportsLineDash","ALIASING_LIMIT","borderDashArray","cornerStrokeColor","cornerDashArray","strokeDashOffset","borderOpacityWhenMoving","borderScaleFactor","minScaleLimit","rotatingPointOffset","statefullCache","paintFirst","stateProperties","cacheProperties","inverted","absolutePositioned","_cacheProperties","_updateCacheCanvas","_limitCacheSize","dims","limitedDims","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","drawingWidth","drawingHeight","minCacheSize","dimensionsChanged","cacheWidth","cacheHeight","zoomChanged","shouldRedraw","additionalWidth","additionalHeight","shouldResizeCanvas","sizeGrowing","sizeShrinking","setTransform","calcOwnMatrix","_removeDefaultValues","getObjectScaling","scaling","retina","getObjectOpacity","shouldConstrainValue","isChanged","groupNeedsUpdate","_constrainScale","isOnACache","setOnGroup","getViewportTransform","isNotVisible","isOnScreen","_setupCompositeOperation","drawSelectionBackground","_setOpacity","drawCacheOnCanvas","_removeCacheCanvas","drawObject","propertySet","isCacheDirty","hasStroke","hasFill","needsItsOwnCache","ownCaching","willDrawShadow","drawClipPathOnCache","originalFill","originalStroke","_setClippingProperties","_setStrokeStyles","_setFillStyles","_drawClipPath","skipCanvas","_getNonTransformedDimensions","_removeShadow","decl","lineDashOffset","dashArray","alternative","getLineDash","styleOverride","drawBorders","forActiveSelection","drawBordersInGroup","multX","multY","_applyPatternGradientTransform","_renderPaintInOrder","_renderStroke","_renderFill","_renderDashedStroke","_applyPatternForTransformedGradient","pCtx","pCanvas","retinaScaling","_findCenterFromElement","_assignTransformMatrixProps","preserveAspectRatioOptions","cropX","cropY","offsetLeft","offsetTop","objectForm","_fromObject","cloneAsImage","utils","origParams","originalShadow","withoutTransform","withoutShadow","boundingRect","getBoundingRect","shadowOffset","originalCanvas","isType","setGradient","setPatternFill","shouldCenterOrigin","_setOriginToCenter","_resetOrigin","centerH","viewportCenterH","centerV","viewportCenterV","viewportCenter","getLocalPointer","pClicked","objectLeftTop","createAccessors","extraParam","enlivedProps","originXOffset","originYOffset","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","leftTop","getPointByOrigin","adjustPosition","offsetFrom","offsetTo","hypotFull","getScaledWidth","xFull","yFull","_originalOriginX","_originalOriginY","originPoint","getCoords","multiplyMatrices","oCoords","aCoords","ownMatrixCache","matrixCache","calculate","calcCoords","pointTL","pointBR","intersection","other","lines","_getImageLines","_findCrossPoints","_containsCenterOfCanvas","isPartiallyOnScreen","topline","rightline","bottomline","leftline","xi","iLine","xcount","lineKey","getScaledHeight","scaleToWidth","boundingRectFactor","scaleToHeight","_calcRotateMatrix","_calcTranslateMatrix","startMatrix","finalMatrix","cosP","sinP","cosPSinP","cosPMinusSinP","mtr","_setCornerCoords","transformMatrixKey","sep","prefix","cache","tMatrix","_calcDimensionsTransformMatrix","flipping","dimX","dimY","noSkew","_finalizeDimensions","bbox","_calculateCurrentDimensions","getSvgColorString","getSvgStyles","skipShadow","getSvgFilter","getSvgSpanStyles","useWhiteSpace","term","textDecoration","getSvgTextDecoration","deltaY","overline","underline","linethrough","getSvgCommons","getSvgTransform","full","svgTransform","getSvgTransformMatrix","_setSVGBg","textBgRects","_getFillAttributes","_createBaseSVGMarkup","_toSVG","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","clipPathMarkup","noStyle","styleInfo","shadowInfo","withShadow","vectorEffect","absoluteClipPath","addPaintOrder","originalSet","saveProps","tmpObj","_isEqual","origValue","currentValue","firstPass","dashedPropertySet","_controlsVisibility","isControlVisible","newTheta","cornerHypotenuse","cosHalfOffset","sinHalfOffset","wh","drawRotatingPoint","rotateHeight","scaleOffset","_drawControl","control","controlName","_getControlsVisibility","setControlVisible","FX_DURATION","fxCenterObjectH","callbacks","empty","fxCenterObjectV","fxRemove","skipCallbacks","propsToAnimate","_animate","propPair","valueProgress","timeProgress","coordProps","makeEdgeToOriginGetter","propertyNames","originValues","axis1","axis2","dimension","nearest","farthest","_setWidthHeight","_getLeftToOriginX","_getTopToOriginY","origStrokeStyle","xMult","yMult","ATTRIBUTE_NAMES","parsedAttributes","_callback","pi","isValidRadius","startAngle","endAngle","setRadius","svgString","startX","startY","endX","endY","largeFlag","getRadiusX","getRadiusY","Triangle","widthBy2","heightBy2","piBy2","getRx","getRy","_initRxRy","isRounded","Polyline","_setPositionDimensions","correctLeftTop","calcDim","_calcDimensions","fromSVG","diffX","diffY","commonRender","fromElementGenerator","_class","Polygon","_toString","commandLengths","repeatedCommands","M","fromArray","_parsePath","_renderPathCommands","tempX","tempY","previous","subpathStartX","subpathStartY","controlX","controlY","_getOffsetTransform","digits","currentPath","coordsStr","coordsParsed","re","command","commandLength","repeatedCommand","klen","aX","aY","deltaX","pathUrl","useSetOnGroup","isAlreadyGrouped","_updateObjectsACoords","_calcBounds","_updateObjectsCoords","_updateObjectCoords","objectLeft","objectTop","_restoreObjectsState","_includeDefaultValues","objsToObject","originalDefaults","_obj","ownCache","_restoreObjectState","destroy","toActiveSelection","ungroupOnCanvas","setObjectsCoords","onlyWidthHeight","iLen","jLen","_getBounds","minXY","maxXY","enlivedClipPath","toGroup","newGroup","childrenOverride","srcFromAttribute","_lastScaleX","_lastScaleY","_filterScalingX","_filterScalingY","minimumScaleTrigger","cacheKey","filters","_initElement","_element","setElement","removeTexture","_initConfig","applyFilters","resizeFilter","applyResizeFilters","backend","filterBackend","evictCachesForKey","setCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","strokeSvg","imageMarkup","getSvgSrc","origFill","filtered","setSrc","minimumScale","elementToFilter","_filteredEl","sourceWidth","sourceHeight","isNeutralState","imgElement","_needsResize","elementToDraw","sW","sH","sX","sY","_resetWidthHeight","CSS_CANVAS","_initFilters","pAR","rWidth","rHeight","pWidth","pHeight","_object","resizeFilters","imgOptions","_getAngleValueForStraighten","straighten","fxStraighten","straightenObject","fxStraightenObject","testPrecision","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","setupGLContext","captureGPUInfo","isSupported","getParameter","MAX_TEXTURE_SIZE","precisions","webGlPrecision","createWebGLCanvas","aPosition","Float32Array","chooseFastestCopyGLTo2DMethod","canUseImageData","canMeasurePerf","performance","canUseArrayBuffer","canUseUint8Clamped","copyGLTo2D","startTime","drawImageTime","putImageDataTime","testContext","now","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","applyTo","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","texture","texParameteri","TEXTURE_MAG_FILTER","NEAREST","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","uniqueId","gpuInfo","renderer","vendor","ext","getExtension","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","sourceElement","originalImageData","originalEl","BaseFilter","vertexSource","createProgram","vertexShader","VERTEX_SHADER","getShaderInfoLog","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","attributeLocations","getAttributeLocations","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","getAttribLocation","sendAttributeData","aPositionData","attributeLocation","createBuffer","bindBuffer","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","_swapTextures","main","mainParameter","applyToWebGL","applyTo2d","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","getMainParameter","setMainParameter","createHelpLayer","helpLayer","mainP","ColorMatrix","colorsOnly","uColorMatrix","uConstants","constants","uniformMatrix4fv","uniform4fv","Brightness","brightness","uBrightness","Convolute","opaque","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","dstOff","scx","scy","srcOff","wt","weights","side","halfSide","sw","sh","output","createImageData","dst","alphaFac","uMatrix","uOpaque","uHalfSize","uSize","uniform1fv","Grayscale","lightness","luminosity","mode","uMode","uniform1i","Invert","invert","uInvert","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_i","_j","_iLen","_jLen","uBlocksize","RemoveColor","useAlpha","lowC","highC","uLow","uHigh","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","BlendColor","screen","diff","lighten","darken","exclusion","tint","buildSource","tg","alpha1","uColor","BlendImage","mask","TEXTURE1","calculateMatrix","canvas1","blendData","blendImage","uTransformMatrix","uImage","uniformMatrix3fv","Resize","resizeType","lanczosLobes","uDelta","uTaps","uniform2fv","horizontal","taps","filterWindow","getFilterWindow","generateShader","tempScale","getTaps","lobeFunction","lanczosCreate","offsets","fragmentSourceTOP","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","newData","oW","oH","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","tmpCanvas","mult","doneW","doneH","stepW","stepH","dX","dY","process","u","weight","fX","fY","ratioX","icenter","ratioY","range2X","cacheLanc","range2Y","lanczos","rcpRatioX","rcpRatioY","srcData","destData","destImg","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","centerY","yy","centerX","w0","Contrast","contrast","contrastF","uContrast","Saturation","saturation","adjust","uSaturation","Blur","aspectRatio","simpleBlur","canvas2","blurLayer1","blurLayer2","percent","ctx1","ctx2","nSamples","newImageData","chooseRightDelta","blurScale","Gamma","gamma","rInv","gInv","bInv","rVals","gVals","bVals","uGamma","uniform3fv","Composed","subFilters","HueRotation","rotation","rad","aThird","aThirdSqtSin","OneMinusCos","_dimensionAffectingProps","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","textAlign","superscript","baseline","subscript","textBackgroundColor","_fontSizeFraction","_fontSizeMult","charSpacing","_measuringContext","_styleProperties","__charBounds","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","__skipDimension","initDimensions","getMeasuringContext","_splitText","newLines","_splitTextIntoLines","textLines","_textLines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","enlargeSpaces","calcTextHeight","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","kernedWidth","lineIndex","missingNewlineOffset","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderText","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","_renderTextLine","_renderChars","styleHas","heightOfLine","lineLeftOffset","lastColor","charBox","currentColor","lineTopOffset","leftOffset","_getLeftOffset","topOffset","_getTopOffset","boxStart","boxWidth","getHeightOfLine","_getLineLeftOffset","getValueOfPropertyAt","getFontCache","cacheProp","_applyCharStyles","styleDeclaration","_measureChar","previousChar","prevCharStyle","coupleWidth","previousWidth","fontCache","fontDeclaration","previousFontDeclaration","couple","stylesAreEqual","fontMultiplier","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","grapheme","prevGrapheme","graphemeInfo","numOfSpaces","lineBounds","_getGraphemeBox","skipLeft","getCompleteStyleDeclaration","prevStyle","info","previousBox","__lineHeights","maxHeight","_renderTextCommon","lineHeights","isEmptyStyles","actualStyle","nextStyle","timeToRender","isJustify","charsToRender","shortCut","_renderChar","_hasStyleChanged","_getStyleDeclaration","fullDecl","shouldFill","shouldStroke","fillText","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","get2DCursorLocation","setSelectionStyles","thisStyle","_hasStyleChangedForSvg","__lineWidths","_shouldClearDimensionCache","shouldClear","_forceClearCache","_size","_dy","lastDecoration","currentDecoration","currentFill","lastFill","styleObject","family","fontIsGeneric","genericFonts","newLine","newText","additionalProperties","needsDims","_key","parsedAnchor","textAnchor","originalStrokeWidth","textHeightScaleFactor","lineHeightDiff","scaledDiff","textHeight","offX","p3","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","stylePropertyHasBeenSet","removeStyle","lineNum","charNum","_extendStyles","_getLineStyle","_setLineStyle","_setStyleDeclaration","skipWrapping","getSelectionStyles","startIndex","endIndex","getStyleAtPosition","lineStyle","_deleteStyleDeclaration","_deleteLineStyle","parseDecoration","editable","editingBorderColor","cursorColor","cursorDelay","cursorDuration","caching","_reSpace","_currentCursorOpacity","_selectionDirection","_abortCursorAnimation","__widthOfSpace","inCompositionMode","initBehavior","setSelectionStart","_updateAndFire","setSelectionEnd","_fireSelectionChanged","_updateTextarea","initDelayedCursor","cursorOffsetCache","renderCursorOrSelection","skipRestore","_clearTextArea","boundaries","_getCursorBoundaries","renderCursor","renderSelection","_getCursorBoundariesOffsets","cursorPosition","cursorLocation","charHeight","__isMousedown","startLine","endLine","startChar","endChar","lineOffset","realLineHeight","boxEnd","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","initAddedHandler","initRemovedHandler","initCursorSelectionHandlers","initDoubleClickSimulation","mouseMoveHandler","_initCanvasHandlers","_removeCanvasHandlers","_tick","_currentTickState","_animateCursor","targetOpacity","completeMethod","tickState","isAborted","_onTickComplete","_cursorTimeout1","_currentTickCompleteState","restart","delay","abortCursorAnimation","_cursorTimeout2","selectAll","getSelectedText","findWordBoundaryLeft","startFrom","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","direction","reNonWord","selectWord","newSelectionStart","newSelectionEnd","selectLine","exitEditingOnOthers","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","initMouseMoveHandler","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","restartCursorIfNeeded","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","graphemeEnd","fromGraphemeToStringSelection","newSelection","updateTextareaPosition","updateFromTextArea","_calcTextareaPosition","desiredPosition","compositionStart","upperCanvas","upperCanvasWidth","upperCanvasHeight","clientWidth","clientHeight","_savedProps","_restoreEditingProps","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","styleObj","cursorStart","cursorEnd","lineStart","charStart","lineEnd","charEnd","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","currentCharStyle","newLineStyles","somethingAdded","numIndex","insertCharStyleObject","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","setSelectionInBoundaries","__lastClickTime","__lastLastClickTime","__lastPointer","__newClickTime","newPointer","isTripleClick","_stopEvent","__lastIsEditing","__lastSelected","initMousedownHandler","initMouseupHandler","initClicks","_mouseDownHandler","setCursorByClick","_mouseDownHandlerBefore","mouseUpHandler","currentActive","mouseOffset","prevWidth","_getNewSelectionStartFromOffset","distanceBtwLastCharAndCursor","distanceBtwNextCharAndCursor","onKeyDown","onKeyUp","onInput","copy","paste","onCompositionStart","onCompositionUpdate","onCompositionEnd","_clickHandlerInitialized","onClick","keysMap","9","27","33","34","35","36","37","38","39","40","ctrlKeysMapUp","67","88","ctrlKeysMapDown","65","keyCode","ctrlKey","metaKey","stopImmediatePropagation","_copyDone","fromPaste","removedText","nextText","charCount","nextCharCount","charDiff","textareaSelection","backDelete","copiedText","copiedTextStyle","compositionEnd","_getClipboardData","clipboardData","_getWidthBeforeCursor","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","textAfterCursor","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","offsetFromRightEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","actionName","moveCursorRightWithShift","moveCursorRightWithoutShift","changed","removeChars","insertChars","multipleSpacesRegex","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","lineTop","noShadow","textSpans","textTopOffset","textLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","styleDecl","shouldUseWhitespace","styleProps","fillStyles","dySpan","_pushTextBgRect","fillColor","_getSVGLineTopOffset","lastHeight","svgStyle","minWidth","dynamicMinWidth","__cachedLines","_wordJoiners","splitByGrapheme","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextOffset","nextLineIndex","shouldLimit","mapNextLine","_wrapText","desiredWidth","wrapped","_wrapLine","_measureWord","word","charOffset","_line","reservedSpace","words","infix","wordWidth","infixWidth","largestWordWidth","lineJustStarted","additionalSpace","linesToKeep","$includes","valueComparator","checkCorrectnessOfIteration","iterable","VCardSubtitle","$copyWithin","getIteratorMethod","isArrayIteratorMethod","step","iterator","argumentsLength","mapping","iteratorMethod","done","$every","every","indeterminate","indeterminateIcon","offIcon","onIcon","inputIndeterminate","computedIcon","validationState","isDisabled","hasError","hasColor","genCheckbox","setTextColor","dense","genInput","genDefaultSlot","flat","hover","link","loaderHeight","raised","genProgress","tag","$toLocaleString","toLocaleString","TO_LOCALE_STRING_BUG","events","app","applicationProperty","removeApplication","activated","mounted","deactivated","destroyed","callUpdate","force","updateApplication","btnToggle","genData","inserted","binding","Scroll","scrollTarget","scrollThreshold","currentScroll","currentThreshold","isScrollingUp","previousScroll","savedScroll","canScroll","computedScrollThreshold","onScroll","thresholdMet","activeClass","grow","hideOnScroll","inputValue","mandatory","updateValue","internalValue","arg","URL","$filter","fromSpeciesAndList","$reduce","middle","inset","vertical","orientation","$listeners","$find","aFunction","IndexedObject","createMethod","IS_RIGHT","TypeError","$forEach","toIndexedObject","arrayMethodIsStrict","lastIndexOf","NEGATIVE_ZERO","STRICT_METHOD","$indexOf","NAME","redefine","uid","Int8ArrayPrototype","Uint8ClampedArrayPrototype","isPrototypeOf","TO_STRING_TAG","opera","TYPED_ARRAY_TAG_REQIRED","TypedArrayConstructorsList","Int16Array","Uint16Array","Int32Array","Uint32Array","Float64Array","BigIntArrayConstructorsList","BigInt64Array","BigUint64Array","isView","ARRAY","KEY","exportTypedArrayStaticMethod","falseValue","trueValue","multiple","label","lazyValue","computedColor","isDark","isMultiple","isDirty","rippleState","genLabel","click","prevent","domProps","checked","onBlur","onFocus"],"mappings":"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","file":"js/pestIdentifyCameraPage.04a9a8b1.js","sourcesContent":["var toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\n\n// `ToIndex` abstract operation\n// https://tc39.es/ecma262/#sec-toindex\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length or index');\n return length;\n};\n","var aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;\nvar speciesConstructor = require('../internals/species-constructor');\n\nmodule.exports = function (instance, list) {\n var C = speciesConstructor(instance, instance.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.copywithin\n// eslint-disable-next-line es/no-array-prototype-copywithin -- safe\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","// Styles\nimport './VOverlay.sass'\n\n// Mixins\nimport Colorable from './../../mixins/colorable'\nimport Themeable from '../../mixins/themeable'\nimport Toggleable from './../../mixins/toggleable'\n\n// Utilities\nimport mixins from '../../util/mixins'\n\n// Types\nimport { VNode } from 'vue'\n\n/* @vue/component */\nexport default mixins(\n Colorable,\n Themeable,\n Toggleable\n).extend({\n name: 'v-overlay',\n\n props: {\n absolute: Boolean,\n color: {\n type: String,\n default: '#212121',\n },\n dark: {\n type: Boolean,\n default: true,\n },\n opacity: {\n type: [Number, String],\n default: 0.46,\n },\n value: {\n default: true,\n },\n zIndex: {\n type: [Number, String],\n default: 5,\n },\n },\n\n computed: {\n __scrim (): VNode {\n const data = this.setBackgroundColor(this.color, {\n staticClass: 'v-overlay__scrim',\n style: {\n opacity: this.computedOpacity,\n },\n })\n\n return this.$createElement('div', data)\n },\n classes (): object {\n return {\n 'v-overlay--absolute': this.absolute,\n 'v-overlay--active': this.isActive,\n ...this.themeClasses,\n }\n },\n computedOpacity (): number {\n return Number(this.isActive ? this.opacity : 0)\n },\n styles (): object {\n return {\n zIndex: this.zIndex,\n }\n },\n },\n\n methods: {\n genContent () {\n return this.$createElement('div', {\n staticClass: 'v-overlay__content',\n }, this.$slots.default)\n },\n },\n\n render (h): VNode {\n const children = [this.__scrim]\n\n if (this.isActive) children.push(this.genContent())\n\n return h('div', {\n staticClass: 'v-overlay',\n class: this.classes,\n style: this.styles,\n }, children)\n },\n})\n","import VOverlay from './VOverlay'\n\nexport { VOverlay }\n\nexport default VOverlay\n","// Components\nimport VOverlay from '../../components/VOverlay'\n\n// Utilities\nimport {\n keyCodes,\n addOnceEventListener,\n addPassiveEventListener,\n getZIndex,\n} from '../../util/helpers'\n\n// Types\nimport Vue from 'vue'\n\ninterface Toggleable extends Vue {\n isActive?: boolean\n}\n\ninterface Stackable extends Vue {\n activeZIndex: number\n}\n\ninterface options {\n absolute?: boolean\n $refs: {\n dialog?: HTMLElement\n content?: HTMLElement\n }\n}\n\n/* @vue/component */\nexport default Vue.extend().extend({\n name: 'overlayable',\n\n props: {\n hideOverlay: Boolean,\n overlayColor: String,\n overlayOpacity: [Number, String],\n },\n\n data () {\n return {\n animationFrame: 0,\n overlay: null as InstanceType | null,\n }\n },\n\n watch: {\n hideOverlay (value) {\n if (!this.isActive) return\n\n if (value) this.removeOverlay()\n else this.genOverlay()\n },\n },\n\n beforeDestroy () {\n this.removeOverlay()\n },\n\n methods: {\n createOverlay () {\n const overlay = new VOverlay({\n propsData: {\n absolute: this.absolute,\n value: false,\n color: this.overlayColor,\n opacity: this.overlayOpacity,\n },\n })\n\n overlay.$mount()\n\n const parent = this.absolute\n ? this.$el.parentNode\n : document.querySelector('[data-app]')\n\n parent && parent.insertBefore(overlay.$el, parent.firstChild)\n\n this.overlay = overlay\n },\n genOverlay () {\n this.hideScroll()\n\n if (this.hideOverlay) return\n\n if (!this.overlay) this.createOverlay()\n\n this.animationFrame = requestAnimationFrame(() => {\n if (!this.overlay) return\n\n if (this.activeZIndex !== undefined) {\n this.overlay.zIndex = String(this.activeZIndex - 1)\n } else if (this.$el) {\n this.overlay.zIndex = getZIndex(this.$el)\n }\n\n this.overlay.value = true\n })\n\n return true\n },\n /** removeOverlay(false) will not restore the scollbar afterwards */\n removeOverlay (showScroll = true) {\n if (this.overlay) {\n addOnceEventListener(this.overlay.$el, 'transitionend', () => {\n if (\n !this.overlay ||\n !this.overlay.$el ||\n !this.overlay.$el.parentNode ||\n this.overlay.value\n ) return\n\n this.overlay.$el.parentNode.removeChild(this.overlay.$el)\n this.overlay.$destroy()\n this.overlay = null\n })\n\n // Cancel animation frame in case\n // overlay is removed before it\n // has finished its animation\n cancelAnimationFrame(this.animationFrame)\n\n this.overlay.value = false\n }\n\n showScroll && this.showScroll()\n },\n scrollListener (e: WheelEvent & KeyboardEvent) {\n if (e.type === 'keydown') {\n if (\n ['INPUT', 'TEXTAREA', 'SELECT'].includes((e.target as Element).tagName) ||\n // https://github.com/vuetifyjs/vuetify/issues/4715\n (e.target as HTMLElement).isContentEditable\n ) return\n\n const up = [keyCodes.up, keyCodes.pageup]\n const down = [keyCodes.down, keyCodes.pagedown]\n\n if (up.includes(e.keyCode)) {\n (e as any).deltaY = -1\n } else if (down.includes(e.keyCode)) {\n (e as any).deltaY = 1\n } else {\n return\n }\n }\n\n if (e.target === this.overlay ||\n (e.type !== 'keydown' && e.target === document.body) ||\n this.checkPath(e)) e.preventDefault()\n },\n hasScrollbar (el?: Element) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE) return false\n\n const style = window.getComputedStyle(el)\n return ['auto', 'scroll'].includes(style.overflowY!) && el.scrollHeight > el.clientHeight\n },\n shouldScroll (el: Element, delta: number) {\n if (el.scrollTop === 0 && delta < 0) return true\n return el.scrollTop + el.clientHeight === el.scrollHeight && delta > 0\n },\n isInside (el: Element, parent: Element): boolean {\n if (el === parent) {\n return true\n } else if (el === null || el === document.body) {\n return false\n } else {\n return this.isInside(el.parentNode as Element, parent)\n }\n },\n checkPath (e: WheelEvent) {\n const path = e.path || this.composedPath(e)\n const delta = e.deltaY\n\n if (e.type === 'keydown' && path[0] === document.body) {\n const dialog = this.$refs.dialog\n // getSelection returns null in firefox in some edge cases, can be ignored\n const selected = window.getSelection()!.anchorNode as Element\n if (dialog && this.hasScrollbar(dialog) && this.isInside(selected, dialog)) {\n return this.shouldScroll(dialog, delta)\n }\n return true\n }\n\n for (let index = 0; index < path.length; index++) {\n const el = path[index]\n\n if (el === document) return true\n if (el === document.documentElement) return true\n if (el === this.$refs.content) return true\n\n if (this.hasScrollbar(el as Element)) return this.shouldScroll(el as Element, delta)\n }\n\n return true\n },\n /**\n * Polyfill for Event.prototype.composedPath\n */\n composedPath (e: WheelEvent): EventTarget[] {\n if (e.composedPath) return e.composedPath()\n\n const path = []\n let el = e.target as Element\n\n while (el) {\n path.push(el)\n\n if (el.tagName === 'HTML') {\n path.push(document)\n path.push(window)\n\n return path\n }\n\n el = el.parentElement!\n }\n return path\n },\n hideScroll () {\n if (this.$vuetify.breakpoint.smAndDown) {\n document.documentElement!.classList.add('overflow-y-hidden')\n } else {\n addPassiveEventListener(window, 'wheel', this.scrollListener as EventHandlerNonNull, { passive: false })\n window.addEventListener('keydown', this.scrollListener as EventHandlerNonNull)\n }\n },\n showScroll () {\n document.documentElement!.classList.remove('overflow-y-hidden')\n window.removeEventListener('wheel', this.scrollListener as EventHandlerNonNull)\n window.removeEventListener('keydown', this.scrollListener as EventHandlerNonNull)\n },\n },\n})\n","// Styles\nimport './VDialog.sass'\n\n// Components\nimport { VThemeProvider } from '../VThemeProvider'\n\n// Mixins\nimport Activatable from '../../mixins/activatable'\nimport Dependent from '../../mixins/dependent'\nimport Detachable from '../../mixins/detachable'\nimport Overlayable from '../../mixins/overlayable'\nimport Returnable from '../../mixins/returnable'\nimport Stackable from '../../mixins/stackable'\nimport Toggleable from '../../mixins/toggleable'\n\n// Directives\nimport ClickOutside from '../../directives/click-outside'\n\n// Helpers\nimport mixins from '../../util/mixins'\nimport { removed } from '../../util/console'\nimport {\n convertToUnit,\n keyCodes,\n} from '../../util/helpers'\n\n// Types\nimport { VNode, VNodeData } from 'vue'\n\nconst baseMixins = mixins(\n Activatable,\n Dependent,\n Detachable,\n Overlayable,\n Returnable,\n Stackable,\n Toggleable\n)\n\n/* @vue/component */\nexport default baseMixins.extend({\n name: 'v-dialog',\n\n directives: { ClickOutside },\n\n props: {\n dark: Boolean,\n disabled: Boolean,\n fullscreen: Boolean,\n light: Boolean,\n maxWidth: {\n type: [String, Number],\n default: 'none',\n },\n noClickAnimation: Boolean,\n origin: {\n type: String,\n default: 'center center',\n },\n persistent: Boolean,\n retainFocus: {\n type: Boolean,\n default: true,\n },\n scrollable: Boolean,\n transition: {\n type: [String, Boolean],\n default: 'dialog-transition',\n },\n width: {\n type: [String, Number],\n default: 'auto',\n },\n },\n\n data () {\n return {\n activatedBy: null as EventTarget | null,\n animate: false,\n animateTimeout: -1,\n isActive: !!this.value,\n stackMinZIndex: 200,\n previousActiveElement: null as HTMLElement | null,\n }\n },\n\n computed: {\n classes (): object {\n return {\n [(`v-dialog ${this.contentClass}`).trim()]: true,\n 'v-dialog--active': this.isActive,\n 'v-dialog--persistent': this.persistent,\n 'v-dialog--fullscreen': this.fullscreen,\n 'v-dialog--scrollable': this.scrollable,\n 'v-dialog--animated': this.animate,\n }\n },\n contentClasses (): object {\n return {\n 'v-dialog__content': true,\n 'v-dialog__content--active': this.isActive,\n }\n },\n hasActivator (): boolean {\n return Boolean(\n !!this.$slots.activator ||\n !!this.$scopedSlots.activator\n )\n },\n },\n\n watch: {\n isActive (val) {\n if (val) {\n this.show()\n this.hideScroll()\n } else {\n this.removeOverlay()\n this.unbind()\n this.previousActiveElement?.focus()\n }\n },\n fullscreen (val) {\n if (!this.isActive) return\n\n if (val) {\n this.hideScroll()\n this.removeOverlay(false)\n } else {\n this.showScroll()\n this.genOverlay()\n }\n },\n },\n\n created () {\n /* istanbul ignore next */\n if (this.$attrs.hasOwnProperty('full-width')) {\n removed('full-width', this)\n }\n },\n\n beforeMount () {\n this.$nextTick(() => {\n this.isBooted = this.isActive\n this.isActive && this.show()\n })\n },\n\n beforeDestroy () {\n if (typeof window !== 'undefined') this.unbind()\n },\n\n methods: {\n animateClick () {\n this.animate = false\n // Needed for when clicking very fast\n // outside of the dialog\n this.$nextTick(() => {\n this.animate = true\n window.clearTimeout(this.animateTimeout)\n this.animateTimeout = window.setTimeout(() => (this.animate = false), 150)\n })\n },\n closeConditional (e: Event) {\n const target = e.target as HTMLElement\n // Ignore the click if the dialog is closed or destroyed,\n // if it was on an element inside the content,\n // if it was dragged onto the overlay (#6969),\n // or if this isn't the topmost dialog (#9907)\n return !(\n this._isDestroyed ||\n !this.isActive ||\n this.$refs.content.contains(target) ||\n (this.overlay && target && !this.overlay.$el.contains(target))\n ) && this.activeZIndex >= this.getMaxZIndex()\n },\n hideScroll () {\n if (this.fullscreen) {\n document.documentElement.classList.add('overflow-y-hidden')\n } else {\n Overlayable.options.methods.hideScroll.call(this)\n }\n },\n show () {\n !this.fullscreen && !this.hideOverlay && this.genOverlay()\n // Double nextTick to wait for lazy content to be generated\n this.$nextTick(() => {\n this.$nextTick(() => {\n this.previousActiveElement = document.activeElement as HTMLElement\n this.$refs.content.focus()\n this.bind()\n })\n })\n },\n bind () {\n window.addEventListener('focusin', this.onFocusin)\n },\n unbind () {\n window.removeEventListener('focusin', this.onFocusin)\n },\n onClickOutside (e: Event) {\n this.$emit('click:outside', e)\n\n if (this.persistent) {\n this.noClickAnimation || this.animateClick()\n } else {\n this.isActive = false\n }\n },\n onKeydown (e: KeyboardEvent) {\n if (e.keyCode === keyCodes.esc && !this.getOpenDependents().length) {\n if (!this.persistent) {\n this.isActive = false\n const activator = this.getActivator()\n this.$nextTick(() => activator && (activator as HTMLElement).focus())\n } else if (!this.noClickAnimation) {\n this.animateClick()\n }\n }\n this.$emit('keydown', e)\n },\n // On focus change, wrap focus to stay inside the dialog\n // https://github.com/vuetifyjs/vuetify/issues/6892\n onFocusin (e: Event) {\n if (!e || !this.retainFocus) return\n\n const target = e.target as HTMLElement\n\n if (\n !!target &&\n // It isn't the document or the dialog body\n ![document, this.$refs.content].includes(target) &&\n // It isn't inside the dialog body\n !this.$refs.content.contains(target) &&\n // We're the topmost dialog\n this.activeZIndex >= this.getMaxZIndex() &&\n // It isn't inside a dependent element (like a menu)\n !this.getOpenDependentElements().some(el => el.contains(target))\n // So we must have focused something outside the dialog and its children\n ) {\n // Find and focus the first available element inside the dialog\n const focusable = this.$refs.content.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])')\n const el = [...focusable].find(el => !el.hasAttribute('disabled')) as HTMLElement | undefined\n el && el.focus()\n }\n },\n genContent () {\n return this.showLazyContent(() => [\n this.$createElement(VThemeProvider, {\n props: {\n root: true,\n light: this.light,\n dark: this.dark,\n },\n }, [\n this.$createElement('div', {\n class: this.contentClasses,\n attrs: {\n role: 'document',\n tabindex: this.isActive ? 0 : undefined,\n ...this.getScopeIdAttrs(),\n },\n on: { keydown: this.onKeydown },\n style: { zIndex: this.activeZIndex },\n ref: 'content',\n }, [this.genTransition()]),\n ]),\n ])\n },\n genTransition () {\n const content = this.genInnerContent()\n\n if (!this.transition) return content\n\n return this.$createElement('transition', {\n props: {\n name: this.transition,\n origin: this.origin,\n appear: true,\n },\n }, [content])\n },\n genInnerContent () {\n const data: VNodeData = {\n class: this.classes,\n ref: 'dialog',\n directives: [\n {\n name: 'click-outside',\n value: {\n handler: this.onClickOutside,\n closeConditional: this.closeConditional,\n include: this.getOpenDependentElements,\n },\n },\n { name: 'show', value: this.isActive },\n ],\n style: {\n transformOrigin: this.origin,\n },\n }\n\n if (!this.fullscreen) {\n data.style = {\n ...data.style as object,\n maxWidth: this.maxWidth === 'none' ? undefined : convertToUnit(this.maxWidth),\n width: this.width === 'auto' ? undefined : convertToUnit(this.width),\n }\n }\n\n return this.$createElement('div', data, this.getContentSlot())\n },\n },\n\n render (h): VNode {\n return h('div', {\n staticClass: 'v-dialog__container',\n class: {\n 'v-dialog__container--attached':\n this.attach === '' ||\n this.attach === true ||\n this.attach === 'attach',\n },\n attrs: { role: 'dialog' },\n }, [\n this.genActivator(),\n this.genContent(),\n ])\n },\n})\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n","var toPositiveInteger = require('../internals/to-positive-integer');\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $sort = [].sort;\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n return $sort.call(aTypedArray(this), comparefn);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $reduceRight = require('../internals/array-reduce').right;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduceRicht` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright\nexportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar speciesConstructor = require('../internals/species-constructor');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $slice = [].slice;\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line es/no-typed-arrays -- required for testing\n new Int8Array(1).slice();\n});\n\n// `%TypedArray%.prototype.slice` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice\nexportTypedArrayMethod('slice', function slice(start, end) {\n var list = $slice.call(aTypedArray(this), start, end);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n}, FORCED);\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',{staticClass:\"h-100 bg-bug\",attrs:{\"fluid\":_vm.fluid}},[_c('v-container',[_c('v-row',[_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"10\",\"offset-sm\":\"1\",\"md\":\"8\",\"offset-md\":\"2\",\"lg\":\"6\",\"offset-lg\":\"3\",\"xl\":\"4\",\"offset-xl\":\"4\"}},[_c('v-row',[_c('v-col',{attrs:{\"cols\":\"12\"}},[_c('v-form',{ref:\"formPestIdentify\"},[_c('div',{staticClass:\"d-flex flex-wrap mb-4\"},[_c('v-menu',{staticClass:\"mb-2\",attrs:{\"rounded\":\"0\",\"offset-y\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar attrs = ref.attrs;\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g(_vm._b({staticClass:\"white--text mr-2 mb-2\",attrs:{\"color\":_vm.colorFill,\"disabled\":_vm.cameraLayer}},'v-btn',attrs,false),on),[_vm._v(\" Drawing tools \")])]}}])},[_c('v-list',_vm._l((_vm.actionItems),function(item,index){return _c('v-list-item',{key:index,on:{\"click\":function($event){return _vm.handleAction(item.action)}}},[_c('v-list-item-title',[_c('v-icon',{attrs:{\"color\":_vm.colorFill}},[_vm._v(_vm._s(item.icon))]),_vm._v(\" \"),_c('span',{staticClass:\"f8-bold\"},[_vm._v(\" \"+_vm._s(item.text)+\" \")])],1)],1)}),1)],1),_c('v-menu',{staticClass:\"mb-2\",attrs:{\"rounded\":\"0\",\"offset-y\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar attrs = ref.attrs;\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g(_vm._b({staticClass:\"white--text mr-2 mb-2\",attrs:{\"color\":_vm.colorFill,\"disabled\":_vm.cameraLayer}},'v-btn',attrs,false),on),[_vm._v(\" Colors \")])]}}])},[_c('v-list',_vm._l((_vm.colorItems),function(item,index){return _c('v-list-item',{key:index,on:{\"click\":function($event){return _vm.setColor(item.color)}}},[_c('v-list-item-title',[_c('v-icon',{attrs:{\"color\":item.color}},[_vm._v(_vm._s(item.icon))]),_vm._v(_vm._s(item.text)+\" \")],1)],1)}),1)],1),_c('v-btn',{attrs:{\"disabled\":_vm.cameraLayer,\"color\":\"secondary\"},on:{\"click\":_vm.handleTrash}},[_vm._v(\"clear\")]),_c('InputUpload',{staticClass:\"d-none\",attrs:{\"buttonTitle\":_vm.uploadLabel},on:{\"changeImage\":_vm.handleUpload}})],1),_c('div',{staticClass:\"editor-wrapper\"},[_c('Editor',{ref:\"editor\",staticStyle:{\"max-width\":\"100% !important\"},attrs:{\"canvasWidth\":_vm.canvasWidth,\"canvasHeight\":_vm.canvasHeight,\"editorId\":\"canvasId\"}}),(_vm.cameraLayer)?_c('div',{staticClass:\"wrapper-layer\",on:{\"click\":_vm.handleOpenCamera}},[_vm._v(\"Touch to open camera\")]):_vm._e()],1),_c('div',{staticClass:\"mt-4\"},[(!_vm.cameraLayer)?_c('v-btn',{attrs:{\"rounded\":\"\",\"color\":\"primary\",\"block\":\"\"},on:{\"click\":_vm.handleSubmit}},[_vm._v(\"Add image\")]):_vm._e()],1)])],1),_c('v-col',{attrs:{\"cols\":\"12\"}},[_c('v-row',_vm._l((_vm.images),function(img,index){return _c('v-col',{key:index,attrs:{\"cols\":\"6\"}},[_c('v-card',{staticClass:\"no-border-radius\"},[_c('v-img',{staticClass:\"grey darken-4\",attrs:{\"src\":img}}),_c('div',{staticClass:\"text-center\"},[_c('v-btn',{attrs:{\"small\":\"\",\"text\":\"\",\"tile\":\"\",\"color\":\"error\"},on:{\"click\":function($event){return _vm.handleDelete(index)}}},[_vm._v(\" Delete \")])],1)],1)],1)}),1)],1)],1),(_vm.images.length)?_c('v-bottom-navigation',{staticClass:\"abc\",attrs:{\"horizontal\":\"\",\"background-color\":\"primary\",\"fixed\":\"\"}},[_c('div',{staticClass:\"bottom-toolbar\",on:{\"click\":_vm.handleNext}},[_c('span',[_vm._v(\"Next\")])])]):_vm._e()],1)],1)],1),_c('PestNote',{attrs:{\"dialog-pest-note\":_vm.dialogPestNote,\"source\":_vm.source},on:{\"close\":_vm.handleClose,\"submit\":_vm.submitPest}}),_c('DialogConfirm',{attrs:{\"dialog-confirm\":_vm.modalConfirm},on:{\"close\":_vm.handleCloseConfirm,\"confirm\":_vm.handleCloseConfirm}}),_c('AddressAdd',{attrs:{\"dialogAddress\":_vm.dialogAddress},on:{\"close\":_vm.handleCloseAddress}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-row',{attrs:{\"justify\":\"center\"}},[_c('v-dialog',{attrs:{\"persistent\":\"\",\"max-width\":\"290\"},model:{value:(_vm.dialogConfirm),callback:function ($$v) {_vm.dialogConfirm=$$v},expression:\"dialogConfirm\"}},[_c('v-card',[_c('v-card-text',{staticClass:\"text-center\"},[_c('h3',{staticStyle:{\"padding-top\":\"40px\"}},[_vm._v(\"Do you want to Delete ?\")])]),_c('v-card-actions',[_c('v-btn',{attrs:{\"color\":\"secondary\",\"text\":\"\"},on:{\"click\":_vm.handleClose}},[_vm._v(\" No \")]),_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"primary\",\"text\":\"\",\"loading\":_vm.loading},on:{\"click\":_vm.handleConfirm}},[_vm._v(\" Yes \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DialogDeleteConfirm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DialogDeleteConfirm.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DialogDeleteConfirm.vue?vue&type=template&id=340fd7ef&\"\nimport script from \"./DialogDeleteConfirm.vue?vue&type=script&lang=js&\"\nexport * from \"./DialogDeleteConfirm.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VDialog,VRow,VSpacer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-row',{attrs:{\"justify\":\"center\"}},[_c('v-dialog',{attrs:{\"persistent\":\"\",\"max-width\":\"350\"},model:{value:(_vm.dialogAddress),callback:function ($$v) {_vm.dialogAddress=$$v},expression:\"dialogAddress\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"d-flex justify-space-between\"},[_c('span',[_vm._v(\" Add Address \")]),_c('v-icon',{on:{\"click\":function($event){return _vm.handleClose(false)}}},[_vm._v(\"mdi-close\")])],1),_c('v-card-text',{staticClass:\"text-center\"},[_c('div',{staticClass:\"form-container\"},[_c('v-form',[_c('v-row',[_c('v-col',{attrs:{\"cols\":\"12\",\"md\":\"12\"}},[_c('InputAddress',{attrs:{\"id\":\"pickup-address\",\"default-value\":_vm.defaultValue},on:{\"selectAddr\":_vm.addressSelected}})],1),_c('v-col',{attrs:{\"cols\":\"12\"}},[_c('v-text-field',{attrs:{\"rules\":_vm.requiredRules,\"label\":\"State\",\"required\":\"\"},model:{value:(_vm.address.state),callback:function ($$v) {_vm.$set(_vm.address, \"state\", $$v)},expression:\"address.state\"}})],1),_c('v-col',{attrs:{\"cols\":\"6\"}},[_c('v-text-field',{attrs:{\"rules\":_vm.requiredRules,\"label\":\"City\",\"required\":\"\"},model:{value:(_vm.address.city),callback:function ($$v) {_vm.$set(_vm.address, \"city\", $$v)},expression:\"address.city\"}})],1),_c('v-col',{attrs:{\"cols\":\"6\",\"sm\":\"6\"}},[_c('v-text-field',{directives:[{name:\"mask\",rawName:\"v-mask\",value:('#########'),expression:\"'#########'\"}],attrs:{\"label\":\"ZIP\",\"required\":\"\"},model:{value:(_vm.address.zip),callback:function ($$v) {_vm.$set(_vm.address, \"zip\", $$v)},expression:\"address.zip\"}})],1),_c('v-col',{attrs:{\"cols\":\"12\"}},[_c('v-checkbox',{attrs:{\"label\":\"Make default address\"},model:{value:(_vm.address.is_default),callback:function ($$v) {_vm.$set(_vm.address, \"is_default\", $$v)},expression:\"address.is_default\"}})],1),_c('v-col',{staticClass:\"text-center\",attrs:{\"cols\":\"12\"}},[_c('v-btn',{attrs:{\"color\":\"primary\",\"block\":\"\",\"rounded\":\"\"},on:{\"click\":_vm.handleSubmit}},[_vm._v(\"Submit\")])],1)],1)],1)],1)])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddressAddPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddressAddPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AddressAddPage.vue?vue&type=template&id=409e24f4&\"\nimport script from \"./AddressAddPage.vue?vue&type=script&lang=js&\"\nexport * from \"./AddressAddPage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VForm } from 'vuetify/lib/components/VForm';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VBtn,VCard,VCardText,VCardTitle,VCheckbox,VCol,VDialog,VForm,VIcon,VRow,VTextField})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"custom-editor\"},[_c('canvas',{attrs:{\"id\":_vm.editorId}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import {fabric} from \"fabric\";\n\nexport default (function () {\n\n let history = [];\n function CanvasHistory(canvas,cropObject = false,redoHistory = false) {\n if(redoHistory){\n if(redoHistory.backgroundImage){\n delete redoHistory.backgroundImage\n } \n history.push(redoHistory)\n }\n if(canvas){\n this.canvas = canvas; \n let currentCanvas = this.canvas.toJSON(); \n currentCanvas.objects.forEach(function(object) {\n if(object.type == \"lineArrow\"){\n object.heads = [1, 0];\n }\n });\n let currentJson = {}; \n \n if(cropObject){\n currentJson = Object.assign(currentJson,cropObject);\n currentJson.json.objects.forEach(function(object) {\n if(object.type == \"lineArrow\"){\n object.heads = [1, 0];\n }\n });\n }\n history.push(currentJson); \n }\n return history; \n }; \n return CanvasHistory;\n}());\n","import {fabric} from 'fabric';\nimport CanvasHistory from \"./canvasHistory\";\n\nexport default (function () {\n let drag;\n let shape;\n let color;\n let lineWidth, fillCircle, angle,shapeId;\n let strokeDashArray;\n let borderRadius;\n let properties;\n let isDown = false;\n\n function Shape(canvas, draggable = false, type, params) {\n if (!draggable) {\n drag = false;\n return Shape;\n }\n if (color && color !== params.stroke) {\n color = params.stroke;\n shape = type;\n new Shape(canvas, true, shape, params)\n return Shape;\n }\n if ((shape && shape !== type)) {\n shape = type;\n drag = true;\n new Shape(canvas, true, shape, params)\n return Shape;\n }\n properties = params;\n if (properties) {\n fillCircle = properties.fill;\n color = properties.stroke;\n lineWidth = properties.strokeWidth;\n angle = properties.angle;\n strokeDashArray = properties.strokeDashArray;\n borderRadius = properties.borderRadius;\n shapeId = properties.id\n }\n this.canvas = canvas;\n this.className = 'Shape';\n this.isDrawing = false;\n this.origX = 0;\n this.origY = 0;\n\n drag = draggable;\n shape = type;\n\n this.bindEvents();\n }\n\n Shape.prototype.bindEvents = function () {\n let inst = this;\n document.onkeydown = (e) => {\n if (e.which === 46 || e.keycode === 46) {\n inst.canvas.getActiveObjects().forEach((obj) => {\n inst.canvas.remove(obj)\n });\n }\n inst.canvas.renderAll()\n };\n inst.selectable = true;\n inst.canvas.off('mouse:down');\n\n inst.canvas.on('mouse:down', function (o) {\n inst.onMouseDown(o);\n });\n inst.canvas.on('mouse:move', function (o) {\n inst.onMouseMove(o);\n });\n inst.canvas.on('mouse:up', function (o) {\n inst.onMouseUp(o);\n });\n inst.canvas.on('object:moving', function () {\n inst.disable();\n });\n\n\n };\n Shape.prototype.onMouseUp = function () {\n isDown = false;\n let inst = this;\n if (!inst.isEnable()) {\n return;\n }\n if (drag) {\n inst.canvas.getObjects().forEach(function (object, index, array) {\n if (index === (array.length - 1)) {\n if (inst.canvas.getActiveObject() && inst.canvas.getActiveObject()._objects && inst.canvas.getActiveObject()._objects.length > 1) {\n inst.canvas.setActiveObject(object);\n\n }\n }\n });\n if (inst.canvas.getActiveObject()) {\n inst.canvas.getActiveObject().hasControls = false;\n inst.canvas.getActiveObject().hasBorders = false;\n inst.canvas.getActiveObject().lockMovementX = true;\n inst.canvas.getActiveObject().lockMovementY = true;\n inst.canvas.getActiveObject().lockUniScaling = true;\n }\n inst.canvas.renderAll();\n }\n let canvasProperties = {width:inst.canvas.width,height:inst.canvas.height}\n let currentCanvas = { json: inst.canvas.toJSON(),canvas: canvasProperties};\n new CanvasHistory(inst.canvas,currentCanvas)\n inst.disable();\n\n };\n Shape.prototype.onMouseMove = function (o) {\n let inst = this;\n if (!inst.isEnable()) {\n return;\n }\n inst.canvas.selection = false;\n let pointer = inst.canvas.getPointer(o.e);\n let activeObj;\n if (inst.canvas.getActiveObject()) {\n activeObj = inst.canvas.getActiveObject();\n activeObj.stroke = color;\n activeObj.strokeWidth = lineWidth;\n activeObj.id = shapeId;\n activeObj.fill = fillCircle;\n activeObj.noScaleCache = false;\n activeObj.strokeUniform = true;\n }\n if (shape !== \"comment\") {\n if (this.origX > pointer.x) {\n activeObj.set({\n left: Math.abs(pointer.x)\n });\n }\n if (this.origY > pointer.y) {\n activeObj.set({\n top: Math.abs(pointer.y)\n });\n }\n }\n if (shape == \"rect\") {\n activeObj.set({\n width: Math.abs(this.origX - pointer.x),\n height: Math.abs(this.origY - pointer.y),\n });\n }\n if (shape == \"comment\") {\n activeObj.set({\n scaleX: Math.abs(this.origY - pointer.y) / 65,\n scaleY: Math.abs(this.origY - pointer.y) / 65\n });\n }\n if (shape == \"line\") {\n if (!isDown) return;\n activeObj.set({x2: pointer.x, y2: pointer.y});\n }\n if (shape == \"circle\") {\n activeObj.set({\n rx: Math.abs(this.origX - pointer.x) / 2,\n ry: Math.abs(this.origY - pointer.y) / 2\n });\n }\n activeObj.setCoords();\n inst.canvas.renderAll();\n };\n\n Shape.prototype.onMouseDown = function (o) {\n isDown = true;\n let inst = this;\n if (!drag) {\n\n if (inst.canvas.getActiveObject()) {\n inst.canvas.getActiveObject().hasControls = shape === 'line' ? false : true;\n inst.canvas.getActiveObject().hasBorders = shape === 'line' ? false : true;\n inst.canvas.getActiveObject().lockMovementX = false;\n inst.canvas.getActiveObject().lockMovementY = false;\n inst.canvas.getActiveObject().lockUniScaling = false;\n inst.canvas.renderAll();\n }\n inst.disable();\n return;\n }\n inst.enable();\n\n if (inst.canvas.getActiveObject()) {\n inst.canvas.getActiveObject().hasControls = false;\n inst.canvas.getActiveObject().hasBorders = false;\n inst.canvas.getActiveObject().lockMovementX = true;\n inst.canvas.getActiveObject().lockMovementY = true;\n inst.canvas.getActiveObject().lockUniScaling = true;\n inst.canvas.renderAll();\n }\n let pointer = inst.canvas.getPointer(o.e);\n this.origX = pointer.x;\n this.origY = pointer.y;\n if (shape === \"rect\") {\n let rect = new fabric.Rect({\n left: this.origX,\n top: this.origY,\n originX: 'left',\n originY: 'top',\n width: pointer.x - this.origX,\n height: pointer.y - this.origY,\n angle: angle,\n fill: fillCircle,\n transparentCorners: false,\n stroke: color,\n strokeWidth: lineWidth,\n strokeDashArray: strokeDashArray,\n rx: borderRadius,\n ry: borderRadius,\n id: shapeId\n });\n inst.canvas.add(rect).setActiveObject(rect);\n }\n if (shape === 'comment') {\n let comment = new fabric.Path(\"M44 48L34 58V48H12C5.373 48 0 42.627 0 36V12C0 5.373 5.373 0 12 0h40c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12h-8z\", {\n left: this.origX,\n top: this.origY,\n originX: 'left',\n originY: 'top',\n scaleX: 0,\n scaleY: 0,\n angle: angle,\n fill: fillCircle,\n transparentCorners: false,\n stroke: color,\n strokeWidth: lineWidth,\n strokeDashArray: strokeDashArray,\n rx: borderRadius,\n ry: borderRadius,\n id: shapeId\n });\n inst.canvas.add(comment).setActiveObject(comment);\n }\n if (shape === \"circle\") {\n let circle = new fabric.Ellipse({\n top: this.origY,\n left: this.origX,\n rx: 0,\n ry: 0,\n transparentCorners: false,\n hasBorders: true,\n hasControls: true,\n fill: fillCircle,\n stroke: color,\n strokeWidth: lineWidth,\n strokeDashArray: strokeDashArray,\n id: shapeId\n });\n inst.canvas.add(circle).setActiveObject(circle);\n }\n if (shape === \"line\") {\n var points = [pointer.x, pointer.y, pointer.x, pointer.y];\n let line = new fabric.Line(points, {\n strokeDashArray: strokeDashArray,\n stroke: fillCircle,\n originX: 'center',\n originY: 'center',\n angle: angle,\n transparentCorners: false,\n hasBorders: false,\n hasControls: false\n });\n inst.canvas.add(line).setActiveObject(line);\n }\n };\n Shape.prototype.isEnable = function () {\n return this.isDrawing;\n }\n\n Shape.prototype.enable = function () {\n this.isDrawing = true;\n }\n\n Shape.prototype.disable = function () {\n this.isDrawing = false;\n }\n return Shape;\n}());\n","import {fabric} from \"fabric\";\nimport CanvasHistory from \"./canvasHistory.js\";\n\nexport default (function () {\n let activeObject = false;\n let drag, textColor, textFontFamily, textFontSize, customText, color, textFontStyle, textFontWeight,textId;\n\n function Text(canvas, draggable = false, params) {\n this.canvas = canvas;\n this.isDrawing = false;\n this.origX = 0;\n this.origY = 0;\n this.bindEvents();\n drag = draggable;\n if (color && color !== params.fill) {\n color = params.fill;\n return Text;\n }\n if (params) {\n textColor = params.fill;\n textFontFamily = params.fontFamily;\n textFontSize = params.fontSize;\n textFontStyle = params.fontStyle;\n textFontWeight = params.fontWeight;\n customText = params.placeholder;\n textId = params.id;\n if (canvas.getActiveObject() && canvas.getActiveObject().hasOwnProperty('text')) {\n canvas.getActiveObject().set({\n fill: textColor,\n fontFamily: textFontFamily,\n fontSize: textFontSize,\n fontStyle: textFontStyle,\n fontWeight: textFontWeight,\n id: textId\n });\n canvas.renderAll();\n }\n }\n }\n\n Text.prototype.bindEvents = function () {\n let inst = this;\n inst.selectable = true;\n inst.canvas.on(\"mouse:down\", function (o) {\n inst.onMouseDown(o);\n });\n inst.canvas.on(\"mouse:move\", function (o) {\n inst.onMouseMove(o);\n\n });\n inst.canvas.on(\"mouse:up\", function (o) {\n inst.onMouseUp(o);\n });\n Text.prototype.onMouseUp = function () {\n return Text;\n };\n Text.prototype.onMouseMove = function () {\n let inst = this;\n if (!inst.isEnable()) {\n return;\n }\n activeObject = inst.canvas.getActiveObject();\n inst.canvas.renderAll();\n };\n Text.prototype.onMouseDown = function (o) {\n let inst = this;\n if (drag) {\n inst.enable();\n if (inst.canvas.getActiveObject() && !inst.canvas.getActiveObject().text) {\n inst.canvas.getActiveObject().selectable = false;\n inst.canvas.getActiveObject().evented = false;\n }\n if ((!inst.canvas.getActiveObject() && !activeObject) || (inst.canvas.getActiveObject() && !inst.canvas.getActiveObject().text)) {\n let pointer = inst.canvas.getPointer(o.e);\n this.origX = pointer.x;\n this.origY = pointer.y;\n let text = new fabric.IText(customText, {\n fill: textColor,\n fontFamily: textFontFamily,\n left: this.origX,\n top: this.origY,\n fontSize: textFontSize,\n fontStyle: textFontStyle ? textFontStyle : '',\n fontWeight: textFontWeight,\n hasBorders: false,\n hasControls: false,\n id: textId\n });\n\n text.selectionStart = 0;\n text.selectionEnd = text.text.length;\n inst.canvas.add(text).setActiveObject(text);\n text.enterEditing();\n text.hiddenTextarea.focus();\n inst.canvas.requestRenderAll();\n let canvasProperties = {width:inst.canvas.width,height:inst.canvas.height}\n let currentCanvas = { json: inst.canvas.toJSON(),canvas: canvasProperties};\n new CanvasHistory(inst.canvas,currentCanvas)\n }\n if (inst.canvas.getActiveObject() && activeObject && inst.canvas.getActiveObject().hiddenTextarea) {\n inst.canvas.getActiveObject().hasControls = true;\n inst.canvas.getActiveObject().hasBorders = true;\n inst.canvas.getActiveObject().lockMovementX = true;\n inst.canvas.getActiveObject().lockMovementY = true;\n inst.canvas.getActiveObject().lockUniScaling = true;\n inst.canvas.renderAll();\n }\n }\n };\n };\n Text.prototype.isEnable = function () {\n return this.isDrawing;\n };\n Text.prototype.enable = function () {\n this.isDrawing = true;\n };\n Text.prototype.disable = function () {\n this.isDrawing = false;\n };\n return Text;\n}());\n","import {fabric} from 'fabric';\nimport CanvasHistory from \"./canvasHistory\";\n\nlet params;\nfabric.LineArrow = fabric.util.createClass(fabric.Line, {\n\n type: 'lineArrow',\n initialize: function (element, options) {\n params = options;\n options || (options = {});\n this.callSuper('initialize', element, options);\n },\n\n toObject: function () {\n return fabric.util.object.extend(this.callSuper('toObject'));\n },\n\n _render: function (ctx) {\n this.ctx = ctx;\n this.callSuper('_render', ctx);\n let p = this.calcLinePoints();\n let xDiff = this.x2 - this.x1;\n let yDiff = this.y2 - this.y1;\n let angle = Math.atan2(yDiff, xDiff);\n this.drawArrow(angle, p.x2, p.y2, this.heads[0]);\n ctx.save();\n xDiff = -this.x2 + this.x1;\n yDiff = -this.y2 + this.y1;\n angle = Math.atan2(yDiff, xDiff);\n this.drawArrow(angle, p.x1, p.y1, this.heads[1]);\n },\n\n drawArrow: function (angle, xPos, yPos, head) {\n this.ctx.save();\n if (head) {\n this.ctx.translate(xPos, yPos);\n this.ctx.rotate(angle);\n this.ctx.beginPath();\n this.ctx.moveTo(10, 0);\n let width = params.strokeWidth < 2 ? params.strokeWidth * 6 : params.strokeWidth * 2;\n this.ctx.lineTo(-(width - 2), width);\n this.ctx.lineTo(-(width - 2), -width);\n this.ctx.closePath();\n }\n\n this.ctx.fillStyle = this.stroke;\n this.ctx.fill();\n this.ctx.restore();\n }\n});\n\n\nfabric.LineArrow.fromObject = function (object, callback) {\n callback && callback(new fabric.LineArrow([object.x1, object.y1, object.x2, object.y2], object));\n};\nfabric.LineArrow.async = true;\nfabric.LineArrow.fromObject = function (object, callback) {\n callback && callback(new fabric.LineArrow([object.x1, object.y1, object.x2, object.y2], object));\n};\nfabric.LineArrow.async = true;\n\nexport default (function () {\n let drag;\n let color;\n let lineWidth;\n let fillArrow;\n let strokeDashArray;\n let arrowId;\n let properties;\n\n function Arrow(canvas, draggable = false, params) {\n\n if (!draggable) {\n drag = false;\n return Arrow;\n }\n\n if (color && color !== params.stroke) {\n color = params.stroke;\n new Arrow(canvas, draggable, params)\n return Arrow;\n }\n\n properties = params;\n if (properties) {\n fillArrow = params.fill;\n color = params.stroke;\n lineWidth = params.strokeWidth;\n strokeDashArray = params.strokeDashArray;\n arrowId = params.id;\n }\n this.canvas = canvas;\n this.className = 'Arrow';\n this.isDrawing = false;\n this.bindEvents();\n drag = draggable;\n\n }\n\n Arrow.prototype.bindEvents = function () {\n let inst = this;\n document.onkeydown = (e) => {\n if (e.which === 46 || e.keycode === 46) {\n inst.canvas.getActiveObjects().forEach((obj) => {\n inst.canvas.remove(obj)\n });\n }\n inst.canvas.renderAll()\n };\n inst.selectable = true;\n\n inst.canvas.off('mouse:down');\n inst.canvas.on('mouse:down', function (o) {\n inst.onMouseDown(o);\n });\n inst.canvas.on('mouse:move', function (o) {\n inst.onMouseMove(o);\n });\n inst.canvas.on('mouse:up', function (o) {\n inst.onMouseUp(o);\n\n });\n inst.canvas.on('object:moving', function () {\n inst.disable();\n });\n };\n Arrow.prototype.onMouseUp = function () {\n let inst = this;\n if (!inst.isEnable()) {\n return;\n }\n if (drag) {\n this.line.set({\n dirty: true,\n objectCaching: true\n });\n if (inst.canvas.getActiveObject()) {\n inst.canvas.getActiveObject().hasControls = false;\n inst.canvas.getActiveObject().hasBorders = false;\n inst.canvas.getActiveObject().lockMovementX = true;\n inst.canvas.getActiveObject().lockMovementY = true;\n inst.canvas.getActiveObject().lockUniScaling = true;\n }\n inst.canvas.renderAll();\n let canvasProperties = {width:inst.canvas.width,height:inst.canvas.height}\n let currentCanvas = { json: inst.canvas.toJSON(),canvas: canvasProperties};\n new CanvasHistory(inst.canvas,currentCanvas)\n }\n inst.disable();\n };\n Arrow.prototype.onMouseMove = function (o) {\n let inst = this;\n inst.canvas.selection = false;\n if (!inst.isEnable()) {\n return;\n }\n let pointer = inst.canvas.getPointer(o.e);\n let activeObj = inst.canvas.getActiveObject();\n activeObj.set({\n x2: pointer.x,\n y2: pointer.y\n });\n activeObj.setCoords();\n inst.canvas.renderAll();\n };\n\n Arrow.prototype.onMouseDown = function (o) {\n\n let inst = this;\n if (!drag) {\n if (inst.canvas.getActiveObject()) {\n inst.canvas.getActiveObject().hasControls = true;\n inst.canvas.getActiveObject().hasBorders = true;\n inst.canvas.getActiveObject().lockMovementX = false;\n inst.canvas.getActiveObject().lockMovementY = false;\n inst.canvas.getActiveObject().lockUniScaling = false;\n inst.canvas.renderAll();\n }\n inst.disable();\n return;\n }\n inst.enable();\n if (inst.canvas.getActiveObject()) {\n inst.canvas.getActiveObject().hasControls = false;\n inst.canvas.getActiveObject().hasBorders = false;\n inst.canvas.getActiveObject().lockMovementX = true;\n inst.canvas.getActiveObject().lockMovementY = true;\n inst.canvas.getActiveObject().lockUniScaling = true;\n inst.canvas.renderAll();\n }\n let pointer = inst.canvas.getPointer(o.e);\n let points = [pointer.x, pointer.y, pointer.x, pointer.y];\n this.line = new fabric.LineArrow(points, {\n strokeWidth: lineWidth,\n strokeDashArray: strokeDashArray,\n fill: color,\n stroke: color,\n originX: 'center',\n originY: 'center',\n hasBorders: false,\n hasControls: false,\n objectCaching: false,\n perPixelTargetFind: true,\n heads: [1, 0],\n id: arrowId ? arrowId : 'arrow'\n\n });\n inst.canvas.add(this.line).setActiveObject(this.line);\n\n };\n\n Arrow.prototype.isEnable = function () {\n return this.isDrawing;\n };\n\n Arrow.prototype.enable = function () {\n this.isDrawing = true;\n };\n\n Arrow.prototype.disable = function () {\n this.isDrawing = false;\n };\n\n return Arrow;\n}());\n\n","import {fabric} from \"fabric\";\nimport CanvasHistory from \"./canvasHistory\";\nexport default (function () {\n\n let disabled = false;\n let object, bgImage;\n let src;\n let drag;\n let clipRect, rect, rectRed;\n let overlay = {};\n let properties;\n let cropperWidth, cropperHeight;\n let clip, clipOverlay;\n\n function CropImage(canvas, draggable = false, apply = false, cancel = false, params) {\n this.canvas = canvas;\n if (cancel) {\n this.canvas.remove(clipOverlay);\n // this.canvas.remove(rect);\n this.canvas.remove(rectRed);\n let inst = this;\n this.canvas.getObjects().forEach(function (object) {\n if (object.id === 'clonedCanvasImage') {\n inst.canvas.remove(object);\n }\n })\n }\n if (!draggable) {\n drag = false;\n return CropImage;\n }\n drag = draggable;\n disabled = false;\n properties = params;\n canvas.backgroundColor = \"#fff\";\n\n\n if (drag && apply) {\n canvas.clear();\n let image;\n let backgroundImage = new Promise((resolve => {\n fabric.util.loadImage(src, function (img) {\n\n image = new fabric.Image(img);\n image.set({\n top: (rectRed.height / 2 - rectRed.top + clip.top),\n left: (rectRed.width / 2 - rectRed.left + clip.left),\n originX: 'center',\n originY: 'center',\n })\n canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas));\n canvas.setHeight(rectRed.height * rectRed.scaleY)\n canvas.setWidth(rectRed.width * rectRed.scaleX)\n canvas.calcOffset();\n bgImage = canvas.toDataURL(\"image/jpeg\", 1)\n resolve()\n })\n }))\n\n drag = false;\n apply = false;\n\n return backgroundImage.then(() => {\n canvas.setBackgroundImage(bgImage, canvas.renderAll(canvas))\n let canvasProperties = {width: rectRed.width * rectRed.scaleX, height: rectRed.height * rectRed.scaleY}\n let croppedImage = {\n json: this.canvas.toJSON(),\n canvas: canvasProperties,\n croppedImage: bgImage,\n imagePosition: {top: 0, left: 0}\n };\n new CanvasHistory(this.canvas, croppedImage);\n return CropImage\n\n })\n }\n if (canvas.width <= properties.width || canvas.height <= properties.height) {\n cropperWidth = canvas.width - 50;\n cropperHeight = canvas.height - 50;\n } else {\n cropperWidth = properties.width;\n cropperHeight = properties.height;\n }\n this.bindEvents();\n this.canvas.selectable = false;\n this.canvas.uniScaleTransform = true;\n this.canvas.renderAll();\n let inst = this;\n src = this.canvas.toDataURL('image/jpeg', 1);\n new fabric.Image.fromURL(src, function (oImg) {\n rectRed = new fabric.Rect({\n left: (oImg.width - cropperWidth) / 2,\n top: (oImg.height - cropperHeight) / 2,\n width: cropperWidth,\n height: cropperHeight,\n fill: '',\n imageWidth: oImg.width,\n imageHeight: oImg.height,\n cornerSize: properties.cornerSize,\n hasControls: properties.hasControls,\n borderColor: properties.borderColor,\n cornerColor: properties.cornerColor,\n cornerStyle: properties.cornerStyle,\n transparentCorners: properties.transparentCorners,\n hasRotatingPoint: properties.hasRotatingPoint,\n lockUniScaling: JSON.parse(properties.lockUniScaling),\n noScaleCache: JSON.parse(properties.noScaleCache),\n strokeUniform: JSON.parse(properties.strokeUniform),\n\n clipTo: function (context) {\n context.translate(-this.width / 2, -this.height / 2);\n for (let x = 0; x <= this.width; x += this.width / 3) {\n context.moveTo(x, 0);\n context.lineTo(x, this.height);\n }\n for (let y = 0; y <= this.height; y += this.height / 3) {\n context.moveTo(0, y);\n context.lineTo(this.width, y);\n }\n context.strokeStyle = properties && properties.strokeColor ? properties.strokeColor : '#000';\n context.stroke();\n }\n });\n rectRed.setControlsVisibility({\n tl: true,\n mt: false,\n tr: true,\n ml: false,\n mr: false,\n bl: true,\n mb: false,\n br: true\n }),\n inst.canvas.add(rectRed);\n inst.canvas.bringToFront(rectRed);\n inst.canvas.setActiveObject(rectRed)\n\n clip = {\n left: rectRed.left,\n top: rectRed.top,\n right: rectRed.width + rectRed.left,\n bottom: rectRed.height + rectRed.top\n }\n\n clipOverlay = new fabric.Path('M 0 0 H ' + inst.canvas.width + ' V ' + clip.top + ' H ' + clip.left + ' V '\n + clip.bottom + ' H ' + clip.right + ' V ' + clip.top + ' H ' + inst.canvas.width + ' V ' + inst.canvas.height + ' H 0 Z', {\n left: 0,\n top: 0,\n fill: properties.overlayColor,\n opacity: properties.overlayOpacity,\n selectable: false\n });\n inst.canvas.add(clipOverlay);\n\n });\n this.canvas.renderAll();\n };\n CropImage.prototype.bindEvents = function () {\n let inst = this;\n inst.canvas.on(\"mouse:down\", function (o) {\n inst.onMouseDown(o);\n });\n inst.canvas.on(\"object:scaling\", function (e) {\n\n let target = e.target;\n let newClip = {\n left: target.left,\n top: target.top,\n right: inst.canvas.width - target.left + (target.left - clip.left) * 2 + (target.width * target.scaleX) - target.width,\n bottom: inst.canvas.height - target.top + (target.top - clip.top) * 2 + (target.height * target.scaleY) - target.height\n }\n let updatedPath = new fabric.Path('M 0 0 H ' + inst.canvas.width + ' V ' + newClip.top + ' H ' + newClip.left + ' V '\n + newClip.bottom + ' H ' + newClip.right + ' V ' + newClip.top + ' H ' + inst.canvas.width + ' V ' + inst.canvas.height + ' H 0 Z');\n\n clipOverlay.set({\n path: updatedPath.path,\n });\n clipOverlay.setCoords();\n\n inst.canvas.renderAll()\n\n });\n inst.canvas.on('object:moving', function (e) {\n let target = e.target;\n let newClip = {\n left: target.left,\n top: target.top,\n right: inst.canvas.width - target.left + (target.left - clip.left) * 2 + (target.width * target.scaleX) - target.width,\n bottom: inst.canvas.height - target.top + (target.top - clip.top) * 2 + (target.height * target.scaleY) - target.height\n }\n let updatedPath = new fabric.Path('M 0 0 H ' + inst.canvas.width + ' V ' + newClip.top + ' H ' + newClip.left + ' V '\n + newClip.bottom + ' H ' + newClip.right + ' V ' + newClip.top + ' H ' + inst.canvas.width + ' V ' + inst.canvas.height + ' H 0 Z');\n\n clipOverlay.set({\n path: updatedPath.path,\n });\n clipOverlay.setCoords();\n inst.canvas.renderAll();\n });\n\n CropImage.prototype.onMouseDown = function (event) {\n let inst = this;\n if (disabled || !drag) {\n return CropImage\n }\n inst.canvas.setActiveObject(rectRed);\n };\n };\n\n return CropImage;\n}());\n","\n\n\n\n","import mod from \"-!../../cache-loader/dist/cjs.js??ref--12-0!../../thread-loader/dist/cjs.js!../../babel-loader/lib/index.js!../../cache-loader/dist/cjs.js??ref--0-0!../../vue-loader/lib/index.js??vue-loader-options!./Editor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../cache-loader/dist/cjs.js??ref--12-0!../../thread-loader/dist/cjs.js!../../babel-loader/lib/index.js!../../cache-loader/dist/cjs.js??ref--0-0!../../vue-loader/lib/index.js??vue-loader-options!./Editor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Editor.vue?vue&type=template&id=2a45785a&\"\nimport script from \"./Editor.vue?vue&type=script&lang=js&\"\nexport * from \"./Editor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Editor.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PestIdentifyCameraPage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PestIdentifyCameraPage.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PestIdentifyCameraPage.vue?vue&type=template&id=1db45f44&scoped=true&\"\nimport script from \"./PestIdentifyCameraPage.vue?vue&type=script&lang=js&\"\nexport * from \"./PestIdentifyCameraPage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PestIdentifyCameraPage.vue?vue&type=style&index=0&id=1db45f44&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1db45f44\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBottomNavigation } from 'vuetify/lib/components/VBottomNavigation';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VForm } from 'vuetify/lib/components/VForm';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VRow } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBottomNavigation,VBtn,VCard,VCol,VContainer,VForm,VIcon,VImg,VList,VListItem,VListItemTitle,VMenu,VRow})\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $lastIndexOf = require('../internals/array-last-index-of');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.lastIndexOf` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n return $lastIndexOf.apply(aTypedArray(this), arguments);\n});\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PestIdentifyCameraPage.vue?vue&type=style&index=0&id=1db45f44&lang=scss&scoped=true&\"","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $findIndex = require('../internals/array-iteration').findIndex;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.findIndex` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex\nexportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */) {\n return $findIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('vuetify-google-autocomplete',{attrs:{\"id\":_vm.id,\"placeholder\":_vm.placeholder,\"label\":\"Street\"},on:{\"blur\":_vm.handleBlur,\"placechanged\":_vm.getAddressData},model:{value:(_vm.address.add1),callback:function ($$v) {_vm.$set(_vm.address, \"add1\", $$v)},expression:\"address.add1\"}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputAddress.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputAddress.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./InputAddress.vue?vue&type=template&id=54141bb4&\"\nimport script from \"./InputAddress.vue?vue&type=script&lang=js&\"\nexport * from \"./InputAddress.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toOffset = require('../internals/to-offset');\nvar toObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line es/no-typed-arrays -- required for testing\n new Int8Array(1).set({});\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError('Wrong length');\n while (index < len) this[offset + index] = src[index++];\n}, FORCED);\n","export * from \"-!../../mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../vue-loader/lib/loaders/stylePostLoader.js!../../postcss-loader/src/index.js??ref--6-oneOf-1-2!../../cache-loader/dist/cjs.js??ref--0-0!../../vue-loader/lib/index.js??vue-loader-options!./Editor.vue?vue&type=style&index=0&lang=css&\"","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $map = require('../internals/array-iteration').map;\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.map` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.map\nexportTypedArrayMethod('map', function map(mapfn /* , thisArg */) {\n return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n return new (aTypedArrayConstructor(speciesConstructor(O, O.constructor)))(length);\n });\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-row',{attrs:{\"justify\":\"center\"}},[_c('v-dialog',{staticClass:\"borde-radius-4\",attrs:{\"max-width\":\"400\",\"persistent\":\"\"},model:{value:(_vm.dialogPestNote),callback:function ($$v) {_vm.dialogPestNote=$$v},expression:\"dialogPestNote\"}},[_c('v-card',{staticClass:\"border-radius-4\"},[_c('v-card-title',{staticClass:\"text-uppercase\"},[_vm._v(\"Write Note\")]),_c('v-card-text',{staticClass:\"pb-0\"},[_c('v-textarea',{staticClass:\"no-border-radius mt-6\",attrs:{\"placeholder\":\"Write\",\"outlined\":\"\",\"auto-grow\":\"\"},model:{value:(_vm.note),callback:function ($$v) {_vm.note=$$v},expression:\"note\"}})],1),_c('v-divider'),_c('v-card-actions',[_c('v-btn',{attrs:{\"color\":\"secondary\",\"text\":\"\"},on:{\"click\":_vm.handleClose}},[_vm._v(\" Close \")]),_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"primary\",\"text\":\"\"},on:{\"click\":_vm.handleSubmit}},[_vm._v(\" Submit \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PestIdentifyNote.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PestIdentifyNote.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PestIdentifyNote.vue?vue&type=template&id=fd78efee&\"\nimport script from \"./PestIdentifyNote.vue?vue&type=script&lang=js&\"\nexport * from \"./PestIdentifyNote.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextarea } from 'vuetify/lib/components/VTextarea';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VDialog,VDivider,VRow,VSpacer,VTextarea})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"file-wrapper\"},[_c('v-btn',{attrs:{\"color\":\"primary\",\"rounded\":\"\"}},[_c('v-icon',{staticClass:\"pr-2\"},[_vm._v(_vm._s(_vm.iconCamera)+\" \")]),_vm._v(\" \"+_vm._s(_vm.buttonTitle)+\" \"),_c('div',[_c('input',{attrs:{\"type\":\"file\"}}),_c('label',{staticClass:\"custom-file-upload\"},[_c('input',{attrs:{\"type\":\"file\",\"name\":\"selected_image\",\"multiple\":\"\",\"id\":\"image_file\",\"accept\":\"image/*\"},on:{\"change\":_vm.fileChanged}})])])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputUploadButton.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputUploadButton.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./InputUploadButton.vue?vue&type=template&id=27e7f2c0&scoped=true&\"\nimport script from \"./InputUploadButton.vue?vue&type=script&lang=js&\"\nexport * from \"./InputUploadButton.vue?vue&type=script&lang=js&\"\nimport style0 from \"./InputUploadButton.vue?vue&type=style&index=0&id=27e7f2c0&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"27e7f2c0\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\ninstallComponents(component, {VBtn,VIcon})\n","// Components\nimport VInput from '../VInput/VInput'\n\n// Mixins\nimport mixins from '../../util/mixins'\nimport BindsAttrs from '../../mixins/binds-attrs'\nimport { provide as RegistrableProvide } from '../../mixins/registrable'\n\n// Helpers\nimport { VNode } from 'vue'\n\ntype ErrorBag = Record\ntype VInputInstance = InstanceType\ntype Watchers = {\n _uid: number\n valid: () => void\n shouldValidate: () => void\n}\n\n/* @vue/component */\nexport default mixins(\n BindsAttrs,\n RegistrableProvide('form')\n /* @vue/component */\n).extend({\n name: 'v-form',\n\n provide (): object {\n return { form: this }\n },\n\n inheritAttrs: false,\n\n props: {\n disabled: Boolean,\n lazyValidation: Boolean,\n readonly: Boolean,\n value: Boolean,\n },\n\n data: () => ({\n inputs: [] as VInputInstance[],\n watchers: [] as Watchers[],\n errorBag: {} as ErrorBag,\n }),\n\n watch: {\n errorBag: {\n handler (val) {\n const errors = Object.values(val).includes(true)\n\n this.$emit('input', !errors)\n },\n deep: true,\n immediate: true,\n },\n },\n\n methods: {\n watchInput (input: any): Watchers {\n const watcher = (input: any): (() => void) => {\n return input.$watch('hasError', (val: boolean) => {\n this.$set(this.errorBag, input._uid, val)\n }, { immediate: true })\n }\n\n const watchers: Watchers = {\n _uid: input._uid,\n valid: () => {},\n shouldValidate: () => {},\n }\n\n if (this.lazyValidation) {\n // Only start watching inputs if we need to\n watchers.shouldValidate = input.$watch('shouldValidate', (val: boolean) => {\n if (!val) return\n\n // Only watch if we're not already doing it\n if (this.errorBag.hasOwnProperty(input._uid)) return\n\n watchers.valid = watcher(input)\n })\n } else {\n watchers.valid = watcher(input)\n }\n\n return watchers\n },\n /** @public */\n validate (): boolean {\n return this.inputs.filter(input => !input.validate(true)).length === 0\n },\n /** @public */\n reset (): void {\n this.inputs.forEach(input => input.reset())\n this.resetErrorBag()\n },\n resetErrorBag () {\n if (this.lazyValidation) {\n // Account for timeout in validatable\n setTimeout(() => {\n this.errorBag = {}\n }, 0)\n }\n },\n /** @public */\n resetValidation () {\n this.inputs.forEach(input => input.resetValidation())\n this.resetErrorBag()\n },\n register (input: VInputInstance) {\n this.inputs.push(input)\n this.watchers.push(this.watchInput(input))\n },\n unregister (input: VInputInstance) {\n const found = this.inputs.find(i => i._uid === input._uid)\n\n if (!found) return\n\n const unwatch = this.watchers.find(i => i._uid === found._uid)\n if (unwatch) {\n unwatch.valid()\n unwatch.shouldValidate()\n }\n\n this.watchers = this.watchers.filter(i => i._uid !== found._uid)\n this.inputs = this.inputs.filter(i => i._uid !== found._uid)\n this.$delete(this.errorBag, found._uid)\n },\n },\n\n render (h): VNode {\n return h('form', {\n staticClass: 'v-form',\n attrs: {\n novalidate: true,\n ...this.attrs$,\n },\n on: {\n submit: (e: Event) => this.$emit('submit', e),\n },\n }, this.$slots.default)\n },\n})\n","// Directives\nimport ripple from '../../directives/ripple'\n\n// Types\nimport Vue, { VNode, VNodeData, VNodeDirective } from 'vue'\n\nexport default Vue.extend({\n name: 'rippleable',\n\n directives: { ripple },\n\n props: {\n ripple: {\n type: [Boolean, Object],\n default: true,\n },\n },\n\n methods: {\n genRipple (data: VNodeData = {}): VNode | null {\n if (!this.ripple) return null\n\n data.staticClass = 'v-input--selection-controls__ripple'\n\n data.directives = data.directives || []\n data.directives.push({\n name: 'ripple',\n value: { center: true },\n } as VNodeDirective)\n\n return this.$createElement('div', data)\n },\n },\n})\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint8Array` constructor\n// https://tc39.es/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint8', function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $join = [].join;\n\n// `%TypedArray%.prototype.join` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.join\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('join', function join(separator) {\n return $join.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar global = require('../internals/global');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayIterators = require('../modules/es.array.iterator');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar Uint8Array = global.Uint8Array;\nvar arrayValues = ArrayIterators.values;\nvar arrayKeys = ArrayIterators.keys;\nvar arrayEntries = ArrayIterators.entries;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR];\n\nvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\nvar typedArrayValues = function values() {\n return arrayValues.call(aTypedArray(this));\n};\n\n// `%TypedArray%.prototype.entries` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries\nexportTypedArrayMethod('entries', function entries() {\n return arrayEntries.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.keys` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys\nexportTypedArrayMethod('keys', function keys() {\n return arrayKeys.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.values` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.values\nexportTypedArrayMethod('values', typedArrayValues, !CORRECT_ITER_NAME);\n// `%TypedArray%.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator\nexportTypedArrayMethod(ITERATOR, typedArrayValues, !CORRECT_ITER_NAME);\n","'use strict';\nvar global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefineAll = require('../internals/redefine-all');\nvar fails = require('../internals/fails');\nvar anInstance = require('../internals/an-instance');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar IEEE754 = require('../internals/ieee754');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar arrayFill = require('../internals/array-fill');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar $DataView = global[DATA_VIEW];\nvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar RangeError = global.RangeError;\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(number, 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key) {\n defineProperty(Constructor[PROTOTYPE], key, { get: function () { return getInternalState(this)[key]; } });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = bytes.slice(start, start + count);\n return isLittleEndian ? pack : pack.reverse();\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = conversion(+value);\n for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n setInternalState(this, {\n bytes: arrayFill.call(new Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) this.byteLength = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = getInternalState(buffer).byteLength;\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n setInternalState(this, {\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength');\n addGetter($DataView, 'buffer');\n addGetter($DataView, 'byteLength');\n addGetter($DataView, 'byteOffset');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n }\n });\n} else {\n /* eslint-disable no-new -- required for testing */\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1);\n }) || fails(function () {\n new NativeArrayBuffer();\n new NativeArrayBuffer(1.5);\n new NativeArrayBuffer(NaN);\n return NativeArrayBuffer.name != ARRAY_BUFFER;\n })) {\n /* eslint-enable no-new -- required for testing */\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new NativeArrayBuffer(toIndex(length));\n };\n var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE];\n for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) {\n createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n }\n }\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf($DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataViewPrototype.setInt8;\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $some = require('../internals/array-iteration').some;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.some` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.some\nexportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) {\n return $some(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar exportTypedArrayMethod = require('../internals/array-buffer-view-core').exportTypedArrayMethod;\nvar fails = require('../internals/fails');\nvar global = require('../internals/global');\n\nvar Uint8Array = global.Uint8Array;\nvar Uint8ArrayPrototype = Uint8Array && Uint8Array.prototype || {};\nvar arrayToString = [].toString;\nvar arrayJoin = [].join;\n\nif (fails(function () { arrayToString.call({}); })) {\n arrayToString = function toString() {\n return arrayJoin.call(this);\n };\n}\n\nvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n// `%TypedArray%.prototype.toString` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring\nexportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $fill = require('../internals/array-fill');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.fill` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill\n// eslint-disable-next-line no-unused-vars -- required for `.length`\nexportTypedArrayMethod('fill', function fill(value /* , start, end */) {\n return $fill.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayBufferModule = require('../internals/array-buffer');\nvar anInstance = require('../internals/an-instance');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar toOffset = require('../internals/to-offset');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar typedArrayFrom = require('../internals/typed-array-from');\nvar forEach = require('../internals/array-iteration').forEach;\nvar setSpecies = require('../internals/set-species');\nvar definePropertyModule = require('../internals/object-define-property');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar InternalStateModule = require('../internals/internal-state');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar round = Math.round;\nvar RangeError = global.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\nvar addGetter = function (it, key) {\n nativeDefineProperty(it, key, { get: function () {\n return getInternalState(this)[key];\n } });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n return isTypedArrayIndex(target, key = toPrimitive(key, true))\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n && isObject(descriptor)\n && has(descriptor, 'value')\n && !has(descriptor, 'get')\n && !has(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!has(descriptor, 'writable') || descriptor.writable)\n && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = global[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return fromList(TypedArrayConstructor, data);\n } else {\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({\n global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n","// IEEE754 conversions based on https://github.com/feross/ieee754\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = new Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare -- NaN check\n if (number != number || number === Infinity) {\n // eslint-disable-next-line no-self-compare -- NaN check\n mantissa = number != number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n if (number * (c = pow(2, -exponent)) < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent = exponent + eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n buffer[--index] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa = mantissa + pow(2, mantissaLength);\n exponent = exponent - eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n","/* build: `node build.js modules=ALL exclude=gestures,accessors requirejs minifier=uglifyjs` */\n/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */\n\nvar fabric = fabric || { version: '3.4.0' };\nif (typeof exports !== 'undefined') {\n exports.fabric = fabric;\n}\n/* _AMD_START_ */\nelse if (typeof define === 'function' && define.amd) {\n define([], function() { return fabric; });\n}\n/* _AMD_END_ */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) {\n fabric.document = document;\n }\n else {\n fabric.document = document.implementation.createHTMLDocument('');\n }\n fabric.window = window;\n}\nelse {\n // assume we're running under node.js when document/window are not present\n var jsdom = require('jsdom');\n var virtualWindow = new jsdom.JSDOM(\n decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),\n {\n features: {\n FetchExternalResources: ['img']\n },\n resources: 'usable'\n }).window;\n fabric.document = virtualWindow.document;\n fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;\n fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;\n fabric.window = virtualWindow;\n DOMParser = fabric.window.DOMParser;\n}\n\n/**\n * True when in environment that supports touch events\n * @type boolean\n */\nfabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||\n (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);\n\n/**\n * True when in environment that's probably Node.js\n * @type boolean\n */\nfabric.isLikelyNode = typeof Buffer !== 'undefined' &&\n typeof window === 'undefined';\n\n/* _FROM_SVG_START_ */\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nfabric.SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n 'fill', 'fill-opacity', 'fill-rule',\n 'opacity',\n 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',\n 'stroke-linejoin', 'stroke-miterlimit',\n 'stroke-opacity', 'stroke-width',\n 'id', 'paint-order', 'vector-effect',\n 'instantiated_by_use', 'clip-path'\n];\n/* _FROM_SVG_END_ */\n\n/**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\nfabric.DPI = 96;\nfabric.reNum = '(?:[-+]?(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[eE][-+]?\\\\d+)?)';\nfabric.fontPaths = { };\nfabric.iMatrix = [1, 0, 0, 1, 0, 0];\n\n/**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.perfLimitSizeTotal = 2097152;\n\n/**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.maxCacheSideLimit = 4096;\n\n/**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.minCacheSideLimit = 256;\n\n/**\n * Cache Object for widths of chars in text rendering.\n */\nfabric.charWidthsCache = { };\n\n/**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n * @since 2.0.0\n * @type Number\n * @default\n */\nfabric.textureSize = 2048;\n\n/**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @default\n */\nfabric.disableStyleCopyPaste = false;\n\n/**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n * @default\n */\nfabric.enableGLFiltering = true;\n\n/**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\nfabric.devicePixelRatio = fabric.window.devicePixelRatio ||\n fabric.window.webkitDevicePixelRatio ||\n fabric.window.mozDevicePixelRatio ||\n 1;\n/**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\nfabric.browserShadowBlurConstant = 1;\n\n/**\n * This object contains the result of arc to beizer conversion for faster retrieving if the same arc needs to be converted again.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.arcToSegmentsCache = { };\n\n/**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.boundsOfCurveCache = { };\n\n/**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * @default true\n */\nfabric.cachesBoundsOfCurve = true;\n\n/**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\nfabric.forceGLPutImageData = false;\n\nfabric.initFilterBackend = function() {\n if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) {\n console.log('max texture size: ' + fabric.maxTextureSize);\n return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize }));\n }\n else if (fabric.Canvas2dFilterBackend) {\n return (new fabric.Canvas2dFilterBackend());\n }\n};\n\n\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system)\n window.fabric = fabric;\n}\n\n\n(function() {\n\n /**\n * @private\n * @param {String} eventName\n * @param {Function} handler\n */\n function _removeEventListener(eventName, handler) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n var eventListener = this.__eventListeners[eventName];\n if (handler) {\n eventListener[eventListener.indexOf(handler)] = false;\n }\n else {\n fabric.util.array.fill(eventListener, false);\n }\n }\n\n /**\n * Observes specified event\n * @deprecated `observe` deprecated since 0.8.34 (use `on` instead)\n * @memberOf fabric.Observable\n * @alias on\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Self} thisArg\n * @chainable\n */\n function observe(eventName, handler) {\n if (!this.__eventListeners) {\n this.__eventListeners = { };\n }\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n this.on(prop, eventName[prop]);\n }\n }\n else {\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n }\n return this;\n }\n\n /**\n * Stops event observing for a particular event handler. Calling this method\n * without arguments removes all handlers for all events\n * @deprecated `stopObserving` deprecated since 0.8.34 (use `off` instead)\n * @memberOf fabric.Observable\n * @alias off\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function to be deleted from EventListeners\n * @return {Self} thisArg\n * @chainable\n */\n function stopObserving(eventName, handler) {\n if (!this.__eventListeners) {\n return this;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (arguments.length === 0) {\n for (eventName in this.__eventListeners) {\n _removeEventListener.call(this, eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (arguments.length === 1 && typeof arguments[0] === 'object') {\n for (var prop in eventName) {\n _removeEventListener.call(this, prop, eventName[prop]);\n }\n }\n else {\n _removeEventListener.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Fires event with an optional options object\n * @deprecated `fire` deprecated since 1.0.7 (use `trigger` instead)\n * @memberOf fabric.Observable\n * @alias trigger\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n * @return {Self} thisArg\n * @chainable\n */\n function fire(eventName, options) {\n if (!this.__eventListeners) {\n return this;\n }\n\n var listenersForEvent = this.__eventListeners[eventName];\n if (!listenersForEvent) {\n return this;\n }\n\n for (var i = 0, len = listenersForEvent.length; i < len; i++) {\n listenersForEvent[i] && listenersForEvent[i].call(this, options || { });\n }\n this.__eventListeners[eventName] = listenersForEvent.filter(function(value) {\n return value !== false;\n });\n return this;\n }\n\n /**\n * @namespace fabric.Observable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\n fabric.Observable = {\n observe: observe,\n stopObserving: stopObserving,\n fire: fire,\n\n on: observe,\n off: stopObserving,\n trigger: fire\n };\n})();\n\n\n/**\n * @namespace fabric.Collection\n */\nfabric.Collection = {\n\n _objects: [],\n\n /**\n * Adds objects to collection, Canvas or Group, then renders canvas\n * (if `renderOnAddRemove` is not `false`).\n * in case of Group no changes to bounding box are made.\n * Objects should be instances of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the add method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n add: function () {\n this._objects.push.apply(this._objects, arguments);\n if (this._onObjectAdded) {\n for (var i = 0, length = arguments.length; i < length; i++) {\n this._onObjectAdded(arguments[i]);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)\n * An object should be an instance of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the insertAt method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {Object} object Object to insert\n * @param {Number} index Index to insert object at\n * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs\n * @return {Self} thisArg\n * @chainable\n */\n insertAt: function (object, index, nonSplicing) {\n var objects = this._objects;\n if (nonSplicing) {\n objects[index] = object;\n }\n else {\n objects.splice(index, 0, object);\n }\n this._onObjectAdded && this._onObjectAdded(object);\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n remove: function() {\n var objects = this._objects,\n index, somethingRemoved = false;\n\n for (var i = 0, length = arguments.length; i < length; i++) {\n index = objects.indexOf(arguments[i]);\n\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n somethingRemoved = true;\n objects.splice(index, 1);\n this._onObjectRemoved && this._onObjectRemoved(arguments[i]);\n }\n }\n\n this.renderOnAddRemove && somethingRemoved && this.requestRenderAll();\n return this;\n },\n\n /**\n * Executes given function for each object in this group\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n * Callback is invoked in a context of Global Object (e.g. `window`)\n * when no `context` argument is given\n *\n * @param {Object} context Context (aka thisObject)\n * @return {Self} thisArg\n * @chainable\n */\n forEachObject: function(callback, context) {\n var objects = this.getObjects();\n for (var i = 0, len = objects.length; i < len; i++) {\n callback.call(context, objects[i], i, objects);\n }\n return this;\n },\n\n /**\n * Returns an array of children objects of this instance\n * Type parameter introduced in 1.3.10\n * since 2.3.5 this method return always a COPY of the array;\n * @param {String} [type] When specified, only objects of this type are returned\n * @return {Array}\n */\n getObjects: function(type) {\n if (typeof type === 'undefined') {\n return this._objects.concat();\n }\n return this._objects.filter(function(o) {\n return o.type === type;\n });\n },\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Self} thisArg\n */\n item: function (index) {\n return this._objects[index];\n },\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty: function () {\n return this._objects.length === 0;\n },\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size: function() {\n return this._objects.length;\n },\n\n /**\n * Returns true if collection contains an object\n * @param {Object} object Object to check against\n * @return {Boolean} `true` if collection contains an object\n */\n contains: function(object) {\n return this._objects.indexOf(object) > -1;\n },\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity: function () {\n return this._objects.reduce(function (memo, current) {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n};\n\n\n/**\n * @namespace fabric.CommonMethods\n */\nfabric.CommonMethods = {\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n _setOptions: function(options) {\n for (var prop in options) {\n this.set(prop, options[prop]);\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Gradient to\n */\n _initGradient: function(filler, property) {\n if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) {\n this.set(property, new fabric.Gradient(filler));\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Pattern to\n * @param {Function} [callback] callback to invoke after pattern load\n */\n _initPattern: function(filler, property, callback) {\n if (filler && filler.source && !(filler instanceof fabric.Pattern)) {\n this.set(property, new fabric.Pattern(filler, callback));\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initClipping: function(options) {\n if (!options.clipTo || typeof options.clipTo !== 'string') {\n return;\n }\n\n var functionBody = fabric.util.getFunctionBody(options.clipTo);\n if (typeof functionBody !== 'undefined') {\n this.clipTo = new Function('ctx', functionBody);\n }\n },\n\n /**\n * @private\n */\n _setObject: function(obj) {\n for (var prop in obj) {\n this._set(prop, obj[prop]);\n }\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n if (typeof key === 'object') {\n this._setObject(key);\n }\n else {\n if (typeof value === 'function' && key !== 'clipTo') {\n this._set(key, value(this.get(key)));\n }\n else {\n this._set(key, value);\n }\n }\n return this;\n },\n\n _set: function(key, value) {\n this[key] = value;\n },\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n * @return {fabric.Object} thisArg\n * @chainable\n */\n toggle: function(property) {\n var value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n },\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get: function(property) {\n return this[property];\n }\n};\n\n\n(function(global) {\n\n var sqrt = Math.sqrt,\n atan2 = Math.atan2,\n pow = Math.pow,\n PiBy180 = Math.PI / 180,\n PiBy2 = Math.PI / 2;\n\n /**\n * @namespace fabric.util\n */\n fabric.util = {\n\n /**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n cos: function(angle) {\n if (angle === 0) { return 1; }\n if (angle < 0) {\n // cos(a) = cos(-a)\n angle = -angle;\n }\n var angleSlice = angle / PiBy2;\n switch (angleSlice) {\n case 1: case 3: return 0;\n case 2: return -1;\n }\n return Math.cos(angle);\n },\n\n /**\n * Calculate the sin of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n sin: function(angle) {\n if (angle === 0) { return 0; }\n var angleSlice = angle / PiBy2, sign = 1;\n if (angle < 0) {\n // sin(-a) = -sin(a)\n sign = -1;\n }\n switch (angleSlice) {\n case 1: return sign;\n case 2: return 0;\n case 3: return -sign;\n }\n return Math.sin(angle);\n },\n\n /**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @static\n * @memberOf fabric.util\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\n removeFromArray: function(array, value) {\n var idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n },\n\n /**\n * Returns random number between 2 specified ones.\n * @static\n * @memberOf fabric.util\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\n getRandomInt: function(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n },\n\n /**\n * Transforms degrees to radians.\n * @static\n * @memberOf fabric.util\n * @param {Number} degrees value in degrees\n * @return {Number} value in radians\n */\n degreesToRadians: function(degrees) {\n return degrees * PiBy180;\n },\n\n /**\n * Transforms radians to degrees.\n * @static\n * @memberOf fabric.util\n * @param {Number} radians value in radians\n * @return {Number} value in degrees\n */\n radiansToDegrees: function(radians) {\n return radians / PiBy180;\n },\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} point The point to rotate\n * @param {fabric.Point} origin The origin of the rotation\n * @param {Number} radians The radians of the angle for the rotation\n * @return {fabric.Point} The new rotated point\n */\n rotatePoint: function(point, origin, radians) {\n point.subtractEquals(origin);\n var v = fabric.util.rotateVector(point, radians);\n return new fabric.Point(v.x, v.y).addEquals(origin);\n },\n\n /**\n * Rotates `vector` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {Object} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Object} The new rotated point\n */\n rotateVector: function(vector, radians) {\n var sin = fabric.util.sin(radians),\n cos = fabric.util.cos(radians),\n rx = vector.x * cos - vector.y * sin,\n ry = vector.x * sin + vector.y * cos;\n return {\n x: rx,\n y: ry\n };\n },\n\n /**\n * Apply transform t to point p\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {fabric.Point} The transformed point\n */\n transformPoint: function(p, t, ignoreOffset) {\n if (ignoreOffset) {\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y,\n t[1] * p.x + t[3] * p.y\n );\n }\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y + t[4],\n t[1] * p.x + t[3] * p.y + t[5]\n );\n },\n\n /**\n * Returns coordinates of points's bounding rectangle (left, top, width, height)\n * @param {Array} points 4 points array\n * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix\n * @return {Object} Object with left, top, width, height properties\n */\n makeBoundingBoxFromPoints: function(points, transform) {\n if (transform) {\n for (var i = 0; i < points.length; i++) {\n points[i] = fabric.util.transformPoint(points[i], transform);\n }\n }\n var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x],\n minX = fabric.util.array.min(xPoints),\n maxX = fabric.util.array.max(xPoints),\n width = maxX - minX,\n yPoints = [points[0].y, points[1].y, points[2].y, points[3].y],\n minY = fabric.util.array.min(yPoints),\n maxY = fabric.util.array.max(yPoints),\n height = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Invert transformation t\n * @static\n * @memberOf fabric.util\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\n invertTransform: function(t) {\n var a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0]],\n o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true);\n r[4] = -o.x;\n r[5] = -o.y;\n return r;\n },\n\n /**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @static\n * @memberOf fabric.util\n * @param {Number|String} number number to operate on\n * @param {Number} fractionDigits number of fraction digits to \"leave\"\n * @return {Number}\n */\n toFixed: function(number, fractionDigits) {\n return parseFloat(Number(number).toFixed(fractionDigits));\n },\n\n /**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {Number|String} value number to operate on\n * @param {Number} fontSize\n * @return {Number|String}\n */\n parseUnit: function(value, fontSize) {\n var unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n if (!fontSize) {\n fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n switch (unit[0]) {\n case 'mm':\n return number * fabric.DPI / 25.4;\n\n case 'cm':\n return number * fabric.DPI / 2.54;\n\n case 'in':\n return number * fabric.DPI;\n\n case 'pt':\n return number * fabric.DPI / 72; // or * 4 / 3\n\n case 'pc':\n return number * fabric.DPI / 72 * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n },\n\n /**\n * Function which always returns `false`.\n * @static\n * @memberOf fabric.util\n * @return {Boolean}\n */\n falseFunction: function() {\n return false;\n },\n\n /**\n * Returns klass \"Class\" object of given namespace\n * @memberOf fabric.util\n * @param {String} type Type of object (eg. 'circle')\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @return {Object} klass \"Class\"\n */\n getKlass: function(type, namespace) {\n // capitalize first letter only\n type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1));\n return fabric.util.resolveNamespace(namespace)[type];\n },\n\n /**\n * Returns array of attributes for given svg that fabric parses\n * @memberOf fabric.util\n * @param {String} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\n getSvgAttributes: function(type) {\n var attributes = [\n 'instantiated_by_use',\n 'style',\n 'id',\n 'class'\n ];\n switch (type) {\n case 'linearGradient':\n attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']);\n break;\n case 'radialGradient':\n attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']);\n break;\n case 'stop':\n attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']);\n break;\n }\n return attributes;\n },\n\n /**\n * Returns object of given namespace\n * @memberOf fabric.util\n * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric'\n * @return {Object} Object for given namespace (default fabric)\n */\n resolveNamespace: function(namespace) {\n if (!namespace) {\n return fabric;\n }\n\n var parts = namespace.split('.'),\n len = parts.length, i,\n obj = global || fabric.window;\n\n for (i = 0; i < len; ++i) {\n obj = obj[parts[i]];\n }\n\n return obj;\n },\n\n /**\n * Loads image element from given url and passes it to a callback\n * @memberOf fabric.util\n * @param {String} url URL representing an image\n * @param {Function} callback Callback; invoked with loaded image\n * @param {*} [context] Context to invoke callback in\n * @param {Object} [crossOrigin] crossOrigin value to set image element to\n */\n loadImage: function(url, callback, context, crossOrigin) {\n if (!url) {\n callback && callback.call(context, url);\n return;\n }\n\n var img = fabric.util.createImage();\n\n /** @ignore */\n var onLoadCallback = function () {\n callback && callback.call(context, img);\n img = img.onload = img.onerror = null;\n };\n\n img.onload = onLoadCallback;\n /** @ignore */\n img.onerror = function() {\n fabric.log('Error loading ' + img.src);\n callback && callback.call(context, null, true);\n img = img.onload = img.onerror = null;\n };\n\n // data-urls appear to be buggy with crossOrigin\n // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767\n // see https://code.google.com/p/chromium/issues/detail?id=315152\n // https://bugzilla.mozilla.org/show_bug.cgi?id=935069\n if (url.indexOf('data') !== 0 && crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n\n // IE10 / IE11-Fix: SVG contents from data: URI\n // will only be available if the IMG is present\n // in the DOM (and visible)\n if (url.substring(0,14) === 'data:image/svg') {\n img.onload = null;\n fabric.util.loadImageInDom(img, onLoadCallback);\n }\n\n img.src = url;\n },\n\n /**\n * Attaches SVG image with data: URL to the dom\n * @memberOf fabric.util\n * @param {Object} img Image object with data:image/svg src\n * @param {Function} callback Callback; invoked with loaded image\n * @return {Object} DOM element (div containing the SVG image)\n */\n loadImageInDom: function(img, onLoadCallback) {\n var div = fabric.document.createElement('div');\n div.style.width = div.style.height = '1px';\n div.style.left = div.style.top = '-100%';\n div.style.position = 'absolute';\n div.appendChild(img);\n fabric.document.querySelector('body').appendChild(div);\n /**\n * Wrap in function to:\n * 1. Call existing callback\n * 2. Cleanup DOM\n */\n img.onload = function () {\n onLoadCallback();\n div.parentNode.removeChild(div);\n div = null;\n };\n },\n\n /**\n * Creates corresponding fabric instances from their object representations\n * @static\n * @memberOf fabric.util\n * @param {Array} objects Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @param {Function} reviver Method for further parsing of object elements,\n * called after each fabric object created.\n */\n enlivenObjects: function(objects, callback, namespace, reviver) {\n objects = objects || [];\n\n var enlivenedObjects = [],\n numLoadedObjects = 0,\n numTotalObjects = objects.length;\n\n function onLoaded() {\n if (++numLoadedObjects === numTotalObjects) {\n callback && callback(enlivenedObjects.filter(function(obj) {\n // filter out undefined objects (objects that gave error)\n return obj;\n }));\n }\n }\n\n if (!numTotalObjects) {\n callback && callback(enlivenedObjects);\n return;\n }\n\n objects.forEach(function (o, index) {\n // if sparse array\n if (!o || !o.type) {\n onLoaded();\n return;\n }\n var klass = fabric.util.getKlass(o.type, namespace);\n klass.fromObject(o, function (obj, error) {\n error || (enlivenedObjects[index] = obj);\n reviver && reviver(o, obj, error);\n onLoaded();\n });\n });\n },\n\n /**\n * Create and wait for loading of patterns\n * @static\n * @memberOf fabric.util\n * @param {Array} patterns Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * called after each fabric object created.\n */\n enlivenPatterns: function(patterns, callback) {\n patterns = patterns || [];\n\n function onLoaded() {\n if (++numLoadedPatterns === numPatterns) {\n callback && callback(enlivenedPatterns);\n }\n }\n\n var enlivenedPatterns = [],\n numLoadedPatterns = 0,\n numPatterns = patterns.length;\n\n if (!numPatterns) {\n callback && callback(enlivenedPatterns);\n return;\n }\n\n patterns.forEach(function (p, index) {\n if (p && p.source) {\n new fabric.Pattern(p, function(pattern) {\n enlivenedPatterns[index] = pattern;\n onLoaded();\n });\n }\n else {\n enlivenedPatterns[index] = p;\n onLoaded();\n }\n });\n },\n\n /**\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @memberOf fabric.util\n * @param {Array} elements SVG elements to group\n * @param {Object} [options] Options object\n * @param {String} path Value to set sourcePath to\n * @return {fabric.Object|fabric.Group}\n */\n groupSVGElements: function(elements, options, path) {\n var object;\n if (elements && elements.length === 1) {\n return elements[0];\n }\n if (options) {\n if (options.width && options.height) {\n options.centerPoint = {\n x: options.width / 2,\n y: options.height / 2\n };\n }\n else {\n delete options.width;\n delete options.height;\n }\n }\n object = new fabric.Group(elements, options);\n if (typeof path !== 'undefined') {\n object.sourcePath = path;\n }\n return object;\n },\n\n /**\n * Populates an object with properties of another object\n * @static\n * @memberOf fabric.util\n * @param {Object} source Source object\n * @param {Object} destination Destination object\n * @return {Array} properties Properties names to include\n */\n populateWithProperties: function(source, destination, properties) {\n if (properties && Object.prototype.toString.call(properties) === '[object Array]') {\n for (var i = 0, len = properties.length; i < len; i++) {\n if (properties[i] in source) {\n destination[properties[i]] = source[properties[i]];\n }\n }\n }\n },\n\n /**\n * Draws a dashed line between two points\n *\n * This method is used to draw dashed line around selection area.\n * See dotted stroke in canvas\n *\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x start x coordinate\n * @param {Number} y start y coordinate\n * @param {Number} x2 end x coordinate\n * @param {Number} y2 end y coordinate\n * @param {Array} da dash array pattern\n */\n drawDashedLine: function(ctx, x, y, x2, y2, da) {\n var dx = x2 - x,\n dy = y2 - y,\n len = sqrt(dx * dx + dy * dy),\n rot = atan2(dy, dx),\n dc = da.length,\n di = 0,\n draw = true;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.moveTo(0, 0);\n ctx.rotate(rot);\n\n x = 0;\n while (len > x) {\n x += da[di++ % dc];\n if (x > len) {\n x = len;\n }\n ctx[draw ? 'lineTo' : 'moveTo'](x, 0);\n draw = !draw;\n }\n\n ctx.restore();\n },\n\n /**\n * Creates canvas element\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n createCanvasElement: function() {\n return fabric.document.createElement('canvas');\n },\n\n /**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n copyCanvasElement: function(canvas) {\n var newCanvas = fabric.util.createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n newCanvas.getContext('2d').drawImage(canvas, 0, 0);\n return newCanvas;\n },\n\n /**\n * since 2.6.0 moved from canvas instance to utility.\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {Number} quality <= 1 and > 0\n * @static\n * @memberOf fabric.util\n * @return {String} data url\n */\n toDataURL: function(canvasEl, format, quality) {\n return canvasEl.toDataURL('image/' + format, quality);\n },\n\n /**\n * Creates image element (works on client and node)\n * @static\n * @memberOf fabric.util\n * @return {HTMLImageElement} HTML image element\n */\n createImage: function() {\n return fabric.document.createElement('img');\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @deprecated since 2.0.0\n * @param {fabric.Object} receiver Object implementing `clipTo` method\n * @param {CanvasRenderingContext2D} ctx Context to clip\n */\n clipContext: function(receiver, ctx) {\n ctx.save();\n ctx.beginPath();\n receiver.clipTo(ctx);\n ctx.clip();\n },\n\n /**\n * Multiply matrix A by matrix B to nest transformations\n * @static\n * @memberOf fabric.util\n * @param {Array} a First transformMatrix\n * @param {Array} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {Array} The product of the two transform matrices\n */\n multiplyTransformMatrices: function(a, b, is2x2) {\n // Matrix multiply a * b\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]\n ];\n },\n\n /**\n * Decomposes standard 2x3 matrix into transform components\n * @static\n * @memberOf fabric.util\n * @param {Array} a transformMatrix\n * @return {Object} Components of transform\n */\n qrDecompose: function(a) {\n var angle = atan2(a[1], a[0]),\n denom = pow(a[0], 2) + pow(a[1], 2),\n scaleX = sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a [1]) / scaleX,\n skewX = atan2(a[0] * a[2] + a[1] * a [3], denom);\n return {\n angle: angle / PiBy180,\n scaleX: scaleX,\n scaleY: scaleY,\n skewX: skewX / PiBy180,\n skewY: 0,\n translateX: a[4],\n translateY: a[5]\n };\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle] angle in degrees\n * @return {Array[Number]} transform matrix\n */\n calcRotateMatrix: function(options) {\n if (!options.angle) {\n return fabric.iMatrix.concat();\n }\n var theta = fabric.util.degreesToRadians(options.angle),\n cos = fabric.util.cos(theta),\n sin = fabric.util.sin(theta);\n return [cos, sin, -sin, cos, 0, 0];\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @return {Array[Number]} transform matrix\n */\n calcDimensionsMatrix: function(options) {\n var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX,\n scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY,\n scaleMatrix = [\n options.flipX ? -scaleX : scaleX,\n 0,\n 0,\n options.flipY ? -scaleY : scaleY,\n 0,\n 0],\n multiply = fabric.util.multiplyTransformMatrices,\n degreesToRadians = fabric.util.degreesToRadians;\n if (options.skewX) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, 0, Math.tan(degreesToRadians(options.skewX)), 1],\n true);\n }\n if (options.skewY) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, Math.tan(degreesToRadians(options.skewY)), 0, 1],\n true);\n }\n return scaleMatrix;\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Array[Number]} transform matrix\n */\n composeMatrix: function(options) {\n var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0],\n multiply = fabric.util.multiplyTransformMatrices;\n if (options.angle) {\n matrix = multiply(matrix, fabric.util.calcRotateMatrix(options));\n }\n if (options.scaleX || options.scaleY || options.skewX || options.skewY || options.flipX || options.flipY) {\n matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options));\n }\n return matrix;\n },\n\n /**\n * Returns a transform matrix that has the same effect of scaleX, scaleY and skewX.\n * Is deprecated for composeMatrix. Please do not use it.\n * @static\n * @deprecated since 3.4.0\n * @memberOf fabric.util\n * @param {Number} scaleX\n * @param {Number} scaleY\n * @param {Number} skewX\n * @return {Array[Number]} transform matrix\n */\n customTransformMatrix: function(scaleX, scaleY, skewX) {\n return fabric.util.composeMatrix({ scaleX: scaleX, scaleY: scaleY, skewX: skewX });\n },\n\n /**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to transform\n */\n resetObjectTransform: function (target) {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n },\n\n /**\n * Extract Object transform values\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to read from\n * @return {Object} Components of transform\n */\n saveObjectTransform: function (target) {\n return {\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top\n };\n },\n\n /**\n * Returns string representation of function body\n * @param {Function} fn Function to get body of\n * @return {String} Function body\n */\n getFunctionBody: function(fn) {\n return (String(fn).match(/function[^{]*\\{([\\s\\S]*)\\}/) || {})[1];\n },\n\n /**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate\n * @param {Number} y y coordinate\n * @param {Number} tolerance Tolerance\n */\n isTransparent: function(ctx, x, y, tolerance) {\n\n // If tolerance is > 0 adjust start coords to take into account.\n // If moves off Canvas fix to 0\n if (tolerance > 0) {\n if (x > tolerance) {\n x -= tolerance;\n }\n else {\n x = 0;\n }\n if (y > tolerance) {\n y -= tolerance;\n }\n else {\n y = 0;\n }\n }\n\n var _isTransparent = true, i, temp,\n imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1),\n l = imageData.data.length;\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (i = 3; i < l; i += 4) {\n temp = imageData.data[i];\n _isTransparent = temp <= 0;\n if (_isTransparent === false) {\n break; // Stop if colour found\n }\n }\n\n imageData = null;\n\n return _isTransparent;\n },\n\n /**\n * Parse preserveAspectRatio attribute from element\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\n parsePreserveAspectRatioAttribute: function(attribute) {\n var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid',\n aspectRatioAttrs = attribute.split(' '), align;\n\n if (aspectRatioAttrs && aspectRatioAttrs.length) {\n meetOrSlice = aspectRatioAttrs.pop();\n if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') {\n align = meetOrSlice;\n meetOrSlice = 'meet';\n }\n else if (aspectRatioAttrs.length) {\n align = aspectRatioAttrs.pop();\n }\n }\n //divide align in alignX and alignY\n alignX = align !== 'none' ? align.slice(1, 4) : 'none';\n alignY = align !== 'none' ? align.slice(5, 8) : 'none';\n return {\n meetOrSlice: meetOrSlice,\n alignX: alignX,\n alignY: alignY\n };\n },\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @memberOf fabric.util\n * @param {String} [fontFamily] font family to clear\n */\n clearFabricFontCache: function(fontFamily) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n fabric.charWidthsCache = { };\n }\n else if (fabric.charWidthsCache[fontFamily]) {\n delete fabric.charWidthsCache[fontFamily];\n }\n },\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Number} ar aspect ratio\n * @param {Number} maximumArea Maximum area you want to achieve\n * @return {Object.x} Limited dimensions by X\n * @return {Object.y} Limited dimensions by Y\n */\n limitDimsByArea: function(ar, maximumArea) {\n var roughWidth = Math.sqrt(maximumArea * ar),\n perfLimitSizeY = Math.floor(maximumArea / roughWidth);\n return { x: Math.floor(roughWidth), y: perfLimitSizeY };\n },\n\n capValue: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n findScaleToFit: function(source, destination) {\n return Math.min(destination.width / source.width, destination.height / source.height);\n },\n\n findScaleToCover: function(source, destination) {\n return Math.max(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @memberOf fabric.util\n * @param {Array} trasnform an array with 6 numbers\n * @return {String} transform matrix for svg\n * @return {Object.y} Limited dimensions by Y\n */\n matrixToSVG: function(transform) {\n return 'matrix(' + transform.map(function(value) {\n return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS);\n }).join(' ') + ')';\n }\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var _join = Array.prototype.join;\n\n /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n */\n function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {\n var argsString = _join.call(arguments);\n if (fabric.arcToSegmentsCache[argsString]) {\n return fabric.arcToSegmentsCache[argsString];\n }\n\n var PI = Math.PI, th = rotateX * PI / 180,\n sinTh = fabric.util.sin(th),\n cosTh = fabric.util.cos(th),\n fromX = 0, fromY = 0;\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,\n py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,\n rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,\n root = 0;\n\n if (pl < 0) {\n var s = Math.sqrt(1 - pl / (rx2 * ry2));\n rx *= s;\n ry *= s;\n }\n else {\n root = (large === sweep ? -1.0 : 1.0) *\n Math.sqrt( pl / (rx2 * py2 + ry2 * px2));\n }\n\n var cx = root * rx * py / ry,\n cy = -root * ry * px / rx,\n cx1 = cosTh * cx - sinTh * cy + toX * 0.5,\n cy1 = sinTh * cx + cosTh * cy + toY * 0.5,\n mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),\n dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n }\n else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n var segments = Math.ceil(Math.abs(dtheta / PI * 2)),\n result = [], mDelta = dtheta / segments,\n mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),\n th3 = mTheta + mDelta;\n\n for (var i = 0; i < segments; i++) {\n result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);\n fromX = result[i][4];\n fromY = result[i][5];\n mTheta = th3;\n th3 += mDelta;\n }\n fabric.arcToSegmentsCache[argsString] = result;\n return result;\n }\n\n function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {\n var costh2 = fabric.util.cos(th2),\n sinth2 = fabric.util.sin(th2),\n costh3 = fabric.util.cos(th3),\n sinth3 = fabric.util.sin(th3),\n toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,\n toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,\n cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),\n cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),\n cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),\n cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);\n\n return [\n cp1X, cp1Y,\n cp2X, cp2Y,\n toX, toY\n ];\n }\n\n /*\n * Private\n */\n function calcVectorAngle(ux, uy, vx, vy) {\n var ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n }\n else {\n return 2 * Math.PI - (ta - tb);\n }\n }\n\n /**\n * Draws arc\n * @param {CanvasRenderingContext2D} ctx\n * @param {Number} fx\n * @param {Number} fy\n * @param {Array} coords\n */\n fabric.util.drawArc = function(ctx, fx, fy, coords) {\n var rx = coords[0],\n ry = coords[1],\n rot = coords[2],\n large = coords[3],\n sweep = coords[4],\n tx = coords[5],\n ty = coords[6],\n segs = [[], [], [], []],\n segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segsNorm.length; i < len; i++) {\n segs[i][0] = segsNorm[i][0] + fx;\n segs[i][1] = segsNorm[i][1] + fy;\n segs[i][2] = segsNorm[i][2] + fx;\n segs[i][3] = segsNorm[i][3] + fy;\n segs[i][4] = segsNorm[i][4] + fx;\n segs[i][5] = segsNorm[i][5] + fy;\n ctx.bezierCurveTo.apply(ctx, segs[i]);\n }\n };\n\n /**\n * Calculate bounding box of a elliptic-arc\n * @param {Number} fx start point of arc\n * @param {Number} fy\n * @param {Number} rx horizontal radius\n * @param {Number} ry vertical radius\n * @param {Number} rot angle of horizontal axe\n * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points\n * @param {Number} sweep 1 or 0, 1 clockwise or counterclockwise direction\n * @param {Number} tx end point of arc\n * @param {Number} ty\n */\n fabric.util.getBoundsOfArc = function(fx, fy, rx, ry, rot, large, sweep, tx, ty) {\n\n var fromX = 0, fromY = 0, bound, bounds = [],\n segs = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segs.length; i < len; i++) {\n bound = getBoundsOfCurve(fromX, fromY, segs[i][0], segs[i][1], segs[i][2], segs[i][3], segs[i][4], segs[i][5]);\n bounds.push({ x: bound[0].x + fx, y: bound[0].y + fy });\n bounds.push({ x: bound[1].x + fx, y: bound[1].y + fy });\n fromX = segs[i][4];\n fromY = segs[i][5];\n }\n return bounds;\n };\n\n /**\n * Calculate bounding box of a beziercurve\n * @param {Number} x0 starting point\n * @param {Number} y0\n * @param {Number} x1 first control point\n * @param {Number} y1\n * @param {Number} x2 secondo control point\n * @param {Number} y2\n * @param {Number} x3 end of beizer\n * @param {Number} y3\n */\n // taken from http://jsbin.com/ivomiq/56/edit no credits available for that.\n function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {\n var argsString;\n if (fabric.cachesBoundsOfCurve) {\n argsString = _join.call(arguments);\n if (fabric.boundsOfCurveCache[argsString]) {\n return fabric.boundsOfCurveCache[argsString];\n }\n }\n\n var sqrt = Math.sqrt,\n min = Math.min, max = Math.max,\n abs = Math.abs, tvalues = [],\n bounds = [[], []],\n a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n\n for (var i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n sqrtb2ac = sqrt(b2ac);\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n var x, y, j = tvalues.length, jlen = j, mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n bounds[0][j] = x;\n\n y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n var result = [\n {\n x: min.apply(null, bounds[0]),\n y: min.apply(null, bounds[1])\n },\n {\n x: max.apply(null, bounds[0]),\n y: max.apply(null, bounds[1])\n }\n ];\n if (fabric.cachesBoundsOfCurve) {\n fabric.boundsOfCurveCache[argsString] = result;\n }\n return result;\n }\n\n fabric.util.getBoundsOfCurve = getBoundsOfCurve;\n\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice;\n\n /**\n * Invokes method on all items in a given array\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} method Name of a method to invoke\n * @return {Array}\n */\n function invoke(array, method) {\n var args = slice.call(arguments, 2), result = [];\n for (var i = 0, len = array.length; i < len; i++) {\n result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);\n }\n return result;\n }\n\n /**\n * Finds maximum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function max(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 >= value2;\n });\n }\n\n /**\n * Finds minimum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function min(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 < value2;\n });\n }\n\n /**\n * @private\n */\n function fill(array, value) {\n var k = array.length;\n while (k--) {\n array[k] = value;\n }\n return array;\n }\n\n /**\n * @private\n */\n function find(array, byProperty, condition) {\n if (!array || array.length === 0) {\n return;\n }\n\n var i = array.length - 1,\n result = byProperty ? array[i][byProperty] : array[i];\n if (byProperty) {\n while (i--) {\n if (condition(array[i][byProperty], result)) {\n result = array[i][byProperty];\n }\n }\n }\n else {\n while (i--) {\n if (condition(array[i], result)) {\n result = array[i];\n }\n }\n }\n return result;\n }\n\n /**\n * @namespace fabric.util.array\n */\n fabric.util.array = {\n fill: fill,\n invoke: invoke,\n min: min,\n max: max\n };\n\n})();\n\n\n(function() {\n /**\n * Copies all enumerable properties of one js object to another\n * this does not and cannot compete with generic utils.\n * Does not clone or extend fabric.Object subclasses.\n * This is mostly for internal use and has extra handling for fabricJS objects\n * it skips the canvas property in deep cloning.\n * @memberOf fabric.util.object\n * @param {Object} destination Where to copy to\n * @param {Object} source Where to copy from\n * @return {Object}\n */\n\n function extend(destination, source, deep) {\n // JScript DontEnum bug is not taken care of\n // the deep clone is for internal use, is not meant to avoid\n // javascript traps or cloning html element or self referenced objects.\n if (deep) {\n if (!fabric.isLikelyNode && source instanceof Element) {\n // avoid cloning deep images, canvases,\n destination = source;\n }\n else if (source instanceof Array) {\n destination = [];\n for (var i = 0, len = source.length; i < len; i++) {\n destination[i] = extend({ }, source[i], deep);\n }\n }\n else if (source && typeof source === 'object') {\n for (var property in source) {\n if (property === 'canvas') {\n destination[property] = extend({ }, source[property]);\n }\n else if (source.hasOwnProperty(property)) {\n destination[property] = extend({ }, source[property], deep);\n }\n }\n }\n else {\n // this sounds odd for an extend but is ok for recursive use\n destination = source;\n }\n }\n else {\n for (var property in source) {\n destination[property] = source[property];\n }\n }\n return destination;\n }\n\n /**\n * Creates an empty object and copies all enumerable properties of another object to it\n * @memberOf fabric.util.object\n * TODO: this function return an empty object if you try to clone null\n * @param {Object} object Object to clone\n * @return {Object}\n */\n function clone(object, deep) {\n return extend({ }, object, deep);\n }\n\n /** @namespace fabric.util.object */\n fabric.util.object = {\n extend: extend,\n clone: clone\n };\n fabric.util.object.extend(fabric.util, fabric.Observable);\n})();\n\n\n(function() {\n\n /**\n * Camelizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to camelize\n * @return {String} Camelized version of a string\n */\n function camelize(string) {\n return string.replace(/-+(.)?/g, function(match, character) {\n return character ? character.toUpperCase() : '';\n });\n }\n\n /**\n * Capitalizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\n function capitalize(string, firstLetterOnly) {\n return string.charAt(0).toUpperCase() +\n (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase());\n }\n\n /**\n * Escapes XML in a string\n * @memberOf fabric.util.string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\n function escapeXml(string) {\n return string.replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n }\n\n /**\n * Divide a string in the user perceived single units\n * @memberOf fabric.util.string\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\n function graphemeSplit(textstring) {\n var i = 0, chr, graphemes = [];\n for (i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n }\n\n // taken from mdn in the charAt doc page.\n function getWholeChar(str, i) {\n var code = str.charCodeAt(i);\n\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xD800 || code > 0xDFFF) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 <= code && code <= 0xDBFF) {\n if (str.length <= (i + 1)) {\n throw 'High surrogate without following low surrogate';\n }\n var next = str.charCodeAt(i + 1);\n if (0xDC00 > next || next > 0xDFFF) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n var prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 > prev || prev > 0xDBFF) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n }\n\n\n /**\n * String utilities\n * @namespace fabric.util.string\n */\n fabric.util.string = {\n camelize: camelize,\n capitalize: capitalize,\n escapeXml: escapeXml,\n graphemeSplit: graphemeSplit\n };\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice, emptyFunction = function() { },\n\n IS_DONTENUM_BUGGY = (function() {\n for (var p in { toString: 1 }) {\n if (p === 'toString') {\n return false;\n }\n }\n return true;\n })(),\n\n /** @ignore */\n addMethods = function(klass, source, parent) {\n for (var property in source) {\n\n if (property in klass.prototype &&\n typeof klass.prototype[property] === 'function' &&\n (source[property] + '').indexOf('callSuper') > -1) {\n\n klass.prototype[property] = (function(property) {\n return function() {\n\n var superclass = this.constructor.superclass;\n this.constructor.superclass = parent;\n var returnValue = source[property].apply(this, arguments);\n this.constructor.superclass = superclass;\n\n if (property !== 'initialize') {\n return returnValue;\n }\n };\n })(property);\n }\n else {\n klass.prototype[property] = source[property];\n }\n\n if (IS_DONTENUM_BUGGY) {\n if (source.toString !== Object.prototype.toString) {\n klass.prototype.toString = source.toString;\n }\n if (source.valueOf !== Object.prototype.valueOf) {\n klass.prototype.valueOf = source.valueOf;\n }\n }\n }\n };\n\n function Subclass() { }\n\n function callSuper(methodName) {\n var parentMethod = null,\n _this = this;\n\n // climb prototype chain to find method not equal to callee's method\n while (_this.constructor.superclass) {\n var superClassMethod = _this.constructor.superclass.prototype[methodName];\n if (_this[methodName] !== superClassMethod) {\n parentMethod = superClassMethod;\n break;\n }\n // eslint-disable-next-line\n _this = _this.constructor.superclass.prototype;\n }\n\n if (!parentMethod) {\n return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this);\n }\n\n return (arguments.length > 1)\n ? parentMethod.apply(this, slice.call(arguments, 1))\n : parentMethod.call(this);\n }\n\n /**\n * Helper for creation of \"classes\".\n * @memberOf fabric.util\n * @param {Function} [parent] optional \"Class\" to inherit from\n * @param {Object} [properties] Properties shared by all instances of this class\n * (be careful modifying objects defined here as this would affect all instances)\n */\n function createClass() {\n var parent = null,\n properties = slice.call(arguments, 0);\n\n if (typeof properties[0] === 'function') {\n parent = properties.shift();\n }\n function klass() {\n this.initialize.apply(this, arguments);\n }\n\n klass.superclass = parent;\n klass.subclasses = [];\n\n if (parent) {\n Subclass.prototype = parent.prototype;\n klass.prototype = new Subclass();\n parent.subclasses.push(klass);\n }\n for (var i = 0, length = properties.length; i < length; i++) {\n addMethods(klass, properties[i], parent);\n }\n if (!klass.prototype.initialize) {\n klass.prototype.initialize = emptyFunction;\n }\n klass.prototype.constructor = klass;\n klass.prototype.callSuper = callSuper;\n return klass;\n }\n\n fabric.util.createClass = createClass;\n})();\n\n\n(function () {\n // since ie10 or ie9 can use addEventListener but they do not support options, i need to check\n var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent;\n /**\n * Adds an event listener to an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.addListener = function(element, eventName, handler, options) {\n element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n /**\n * Removes an event listener from an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.removeListener = function(element, eventName, handler, options) {\n element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n function getTouchInfo(event) {\n var touchProp = event.changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event;\n }\n\n fabric.util.getPointer = function(event) {\n var element = event.target,\n scroll = fabric.util.getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return {\n x: _evt.clientX + scroll.left,\n y: _evt.clientY + scroll.top\n };\n };\n})();\n\n\n(function () {\n\n /**\n * Cross-browser wrapper for setting element's style\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {Object} styles\n * @return {HTMLElement} Element that was passed as a first argument\n */\n function setStyle(element, styles) {\n var elementStyle = element.style;\n if (!elementStyle) {\n return element;\n }\n if (typeof styles === 'string') {\n element.style.cssText += ';' + styles;\n return styles.indexOf('opacity') > -1\n ? setOpacity(element, styles.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1])\n : element;\n }\n for (var property in styles) {\n if (property === 'opacity') {\n setOpacity(element, styles[property]);\n }\n else {\n var normalizedProperty = (property === 'float' || property === 'cssFloat')\n ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat')\n : property;\n elementStyle[normalizedProperty] = styles[property];\n }\n }\n return element;\n }\n\n var parseEl = fabric.document.createElement('div'),\n supportsOpacity = typeof parseEl.style.opacity === 'string',\n supportsFilters = typeof parseEl.style.filter === 'string',\n reOpacity = /alpha\\s*\\(\\s*opacity\\s*=\\s*([^\\)]+)\\)/,\n\n /** @ignore */\n setOpacity = function (element) { return element; };\n\n if (supportsOpacity) {\n /** @ignore */\n setOpacity = function(element, value) {\n element.style.opacity = value;\n return element;\n };\n }\n else if (supportsFilters) {\n /** @ignore */\n setOpacity = function(element, value) {\n var es = element.style;\n if (element.currentStyle && !element.currentStyle.hasLayout) {\n es.zoom = 1;\n }\n if (reOpacity.test(es.filter)) {\n value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')');\n es.filter = es.filter.replace(reOpacity, value);\n }\n else {\n es.filter += ' alpha(opacity=' + (value * 100) + ')';\n }\n return element;\n };\n }\n\n fabric.util.setStyle = setStyle;\n\n})();\n\n\n(function() {\n\n var _slice = Array.prototype.slice;\n\n /**\n * Takes id and returns an element with that id (if one exists in a document)\n * @memberOf fabric.util\n * @param {String|HTMLElement} id\n * @return {HTMLElement|null}\n */\n function getById(id) {\n return typeof id === 'string' ? fabric.document.getElementById(id) : id;\n }\n\n var sliceCanConvertNodelists,\n /**\n * Converts an array-like object (e.g. arguments or NodeList) to an array\n * @memberOf fabric.util\n * @param {Object} arrayLike\n * @return {Array}\n */\n toArray = function(arrayLike) {\n return _slice.call(arrayLike, 0);\n };\n\n try {\n sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;\n }\n catch (err) { }\n\n if (!sliceCanConvertNodelists) {\n toArray = function(arrayLike) {\n var arr = new Array(arrayLike.length), i = arrayLike.length;\n while (i--) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n /**\n * Creates specified element with specified attributes\n * @memberOf fabric.util\n * @param {String} tagName Type of an element to create\n * @param {Object} [attributes] Attributes to set on an element\n * @return {HTMLElement} Newly created element\n */\n function makeElement(tagName, attributes) {\n var el = fabric.document.createElement(tagName);\n for (var prop in attributes) {\n if (prop === 'class') {\n el.className = attributes[prop];\n }\n else if (prop === 'for') {\n el.htmlFor = attributes[prop];\n }\n else {\n el.setAttribute(prop, attributes[prop]);\n }\n }\n return el;\n }\n\n /**\n * Adds class to an element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to add class to\n * @param {String} className Class to add to an element\n */\n function addClass(element, className) {\n if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {\n element.className += (element.className ? ' ' : '') + className;\n }\n }\n\n /**\n * Wraps element with another element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to wrap\n * @param {HTMLElement|String} wrapper Element to wrap with\n * @param {Object} [attributes] Attributes to set on a wrapper\n * @return {HTMLElement} wrapper\n */\n function wrapElement(element, wrapper, attributes) {\n if (typeof wrapper === 'string') {\n wrapper = makeElement(wrapper, attributes);\n }\n if (element.parentNode) {\n element.parentNode.replaceChild(wrapper, element);\n }\n wrapper.appendChild(element);\n return wrapper;\n }\n\n /**\n * Returns element scroll offsets\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\n function getScrollLeftTop(element) {\n\n var left = 0,\n top = 0,\n docElement = fabric.document.documentElement,\n body = fabric.document.body || {\n scrollLeft: 0, scrollTop: 0\n };\n\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (element && (element.parentNode || element.host)) {\n\n // Set element to element parent, or 'host' in case of ShadowDOM\n element = element.parentNode || element.host;\n\n if (element === fabric.document) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n }\n else {\n left += element.scrollLeft || 0;\n top += element.scrollTop || 0;\n }\n\n if (element.nodeType === 1 && element.style.position === 'fixed') {\n break;\n }\n }\n\n return { left: left, top: top };\n }\n\n /**\n * Returns offset for a given element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\n function getElementOffset(element) {\n var docElem,\n doc = element && element.ownerDocument,\n box = { left: 0, top: 0 },\n offset = { left: 0, top: 0 },\n scrollLeftTop,\n offsetAttributes = {\n borderLeftWidth: 'left',\n borderTopWidth: 'top',\n paddingLeft: 'left',\n paddingTop: 'top'\n };\n\n if (!doc) {\n return offset;\n }\n\n for (var attr in offsetAttributes) {\n offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0;\n }\n\n docElem = doc.documentElement;\n if ( typeof element.getBoundingClientRect !== 'undefined' ) {\n box = element.getBoundingClientRect();\n }\n\n scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top\n };\n }\n\n /**\n * Returns style attribute value of a given element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get style attribute for\n * @param {String} attr Style attribute to get for element\n * @return {String} Style attribute value of the given element.\n */\n var getElementStyle;\n if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {\n getElementStyle = function(element, attr) {\n var style = fabric.document.defaultView.getComputedStyle(element, null);\n return style ? style[attr] : undefined;\n };\n }\n else {\n getElementStyle = function(element, attr) {\n var value = element.style[attr];\n if (!value && element.currentStyle) {\n value = element.currentStyle[attr];\n }\n return value;\n };\n }\n\n (function () {\n var style = fabric.document.documentElement.style,\n selectProp = 'userSelect' in style\n ? 'userSelect'\n : 'MozUserSelect' in style\n ? 'MozUserSelect'\n : 'WebkitUserSelect' in style\n ? 'WebkitUserSelect'\n : 'KhtmlUserSelect' in style\n ? 'KhtmlUserSelect'\n : '';\n\n /**\n * Makes element unselectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementUnselectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = fabric.util.falseFunction;\n }\n if (selectProp) {\n element.style[selectProp] = 'none';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = 'on';\n }\n return element;\n }\n\n /**\n * Makes element selectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make selectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementSelectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = null;\n }\n if (selectProp) {\n element.style[selectProp] = '';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = '';\n }\n return element;\n }\n\n fabric.util.makeElementUnselectable = makeElementUnselectable;\n fabric.util.makeElementSelectable = makeElementSelectable;\n })();\n\n (function() {\n\n /**\n * Inserts a script element with a given url into a document; invokes callback, when that script is finished loading\n * @memberOf fabric.util\n * @param {String} url URL of a script to load\n * @param {Function} callback Callback to execute when script is finished loading\n */\n function getScript(url, callback) {\n var headEl = fabric.document.getElementsByTagName('head')[0],\n scriptEl = fabric.document.createElement('script'),\n loading = true;\n\n /** @ignore */\n scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) {\n if (loading) {\n if (typeof this.readyState === 'string' &&\n this.readyState !== 'loaded' &&\n this.readyState !== 'complete') {\n return;\n }\n loading = false;\n callback(e || fabric.window.event);\n scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null;\n }\n };\n scriptEl.src = url;\n headEl.appendChild(scriptEl);\n // causes issue in Opera\n // headEl.removeChild(scriptEl);\n }\n\n fabric.util.getScript = getScript;\n })();\n\n function getNodeCanvas(element) {\n var impl = fabric.jsdomImplForWrapper(element);\n return impl._canvas || impl._image;\n };\n\n function cleanUpJsdomNode(element) {\n if (!fabric.isLikelyNode) {\n return;\n }\n var impl = fabric.jsdomImplForWrapper(element);\n if (impl) {\n impl._image = null;\n impl._canvas = null;\n // unsure if necessary\n impl._currentSrc = null;\n impl._attributes = null;\n impl._classList = null;\n }\n }\n\n fabric.util.getById = getById;\n fabric.util.toArray = toArray;\n fabric.util.makeElement = makeElement;\n fabric.util.addClass = addClass;\n fabric.util.wrapElement = wrapElement;\n fabric.util.getScrollLeftTop = getScrollLeftTop;\n fabric.util.getElementOffset = getElementOffset;\n fabric.util.getElementStyle = getElementStyle;\n fabric.util.getNodeCanvas = getNodeCanvas;\n fabric.util.cleanUpJsdomNode = cleanUpJsdomNode;\n\n})();\n\n\n(function() {\n\n function addParamToUrl(url, param) {\n return url + (/\\?/.test(url) ? '&' : '?') + param;\n }\n\n function emptyFn() { }\n\n /**\n * Cross-browser abstraction for sending XMLHttpRequest\n * @memberOf fabric.util\n * @param {String} url URL to send XMLHttpRequest to\n * @param {Object} [options] Options object\n * @param {String} [options.method=\"GET\"]\n * @param {String} [options.parameters] parameters to append to url in GET or in body\n * @param {String} [options.body] body to send with POST or PUT request\n * @param {Function} options.onComplete Callback to invoke when request is completed\n * @return {XMLHttpRequest} request\n */\n function request(url, options) {\n options || (options = { });\n\n var method = options.method ? options.method.toUpperCase() : 'GET',\n onComplete = options.onComplete || function() { },\n xhr = new fabric.window.XMLHttpRequest(),\n body = options.body || options.parameters;\n\n /** @ignore */\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n onComplete(xhr);\n xhr.onreadystatechange = emptyFn;\n }\n };\n\n if (method === 'GET') {\n body = null;\n if (typeof options.parameters === 'string') {\n url = addParamToUrl(url, options.parameters);\n }\n }\n\n xhr.open(method, url, true);\n\n if (method === 'POST' || method === 'PUT') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n }\n\n xhr.send(body);\n return xhr;\n }\n\n fabric.util.request = request;\n})();\n\n\n/**\n * Wrapper around `console.log` (when available)\n * @param {*} [values] Values to log\n */\nfabric.log = function() { };\n\n/**\n * Wrapper around `console.warn` (when available)\n * @param {*} [values] Values to log as a warning\n */\nfabric.warn = function() { };\n\n/* eslint-disable */\nif (typeof console !== 'undefined') {\n\n ['log', 'warn'].forEach(function(methodName) {\n\n if (typeof console[methodName] !== 'undefined' &&\n typeof console[methodName].apply === 'function') {\n\n fabric[methodName] = function() {\n return console[methodName].apply(console, arguments);\n };\n }\n });\n}\n/* eslint-enable */\n\n\n(function() {\n\n function noop() {\n return false;\n }\n\n function defaultEasing(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Changes value from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Number} [options.startValue=0] Starting value\n * @param {Number} [options.endValue=100] Ending value\n * @param {Number} [options.byValue=100] Value to modify the property by\n * @param {Function} [options.easing] Easing function\n * @param {Number} [options.duration=500] Duration of change (in ms)\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n */\n function animate(options) {\n\n requestAnimFrame(function(timestamp) {\n options || (options = { });\n\n var start = timestamp || +new Date(),\n duration = options.duration || 500,\n finish = start + duration, time,\n onChange = options.onChange || noop,\n abort = options.abort || noop,\n onComplete = options.onComplete || noop,\n easing = options.easing || defaultEasing,\n startValue = 'startValue' in options ? options.startValue : 0,\n endValue = 'endValue' in options ? options.endValue : 100,\n byValue = options.byValue || endValue - startValue;\n\n options.onStart && options.onStart();\n\n (function tick(ticktime) {\n // TODO: move abort call after calculation\n // and pass (current,valuePerc, timePerc) as arguments\n time = ticktime || +new Date();\n var currentTime = time > finish ? duration : (time - start),\n timePerc = currentTime / duration,\n current = easing(currentTime, startValue, byValue, duration),\n valuePerc = Math.abs((current - startValue) / byValue);\n if (abort()) {\n onComplete(endValue, 1, 1);\n return;\n }\n if (time > finish) {\n onChange(endValue, 1, 1);\n onComplete(endValue, 1, 1);\n return;\n }\n else {\n onChange(current, valuePerc, timePerc);\n requestAnimFrame(tick);\n }\n })(start);\n });\n }\n\n var _requestAnimFrame = fabric.window.requestAnimationFrame ||\n fabric.window.webkitRequestAnimationFrame ||\n fabric.window.mozRequestAnimationFrame ||\n fabric.window.oRequestAnimationFrame ||\n fabric.window.msRequestAnimationFrame ||\n function(callback) {\n return fabric.window.setTimeout(callback, 1000 / 60);\n };\n\n var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout;\n\n /**\n * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method\n * @memberOf fabric.util\n * @param {Function} callback Callback to invoke\n * @param {DOMElement} element optional Element to associate with animation\n */\n function requestAnimFrame() {\n return _requestAnimFrame.apply(fabric.window, arguments);\n }\n\n function cancelAnimFrame() {\n return _cancelAnimFrame.apply(fabric.window, arguments);\n }\n\n fabric.util.animate = animate;\n fabric.util.requestAnimFrame = requestAnimFrame;\n fabric.util.cancelAnimFrame = cancelAnimFrame;\n})();\n\n\n(function() {\n // Calculate an in-between color. Returns a \"rgba()\" string.\n // Credit: Edwin Martin \n // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js\n function calculateColor(begin, end, pos) {\n var color = 'rgba('\n + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ','\n + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ','\n + parseInt((begin[2] + pos * (end[2] - begin[2])), 10);\n\n color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1);\n color += ')';\n return color;\n }\n\n /**\n * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {String} fromColor The starting color in hex or rgb(a) format.\n * @param {String} toColor The starting color in hex or rgb(a) format.\n * @param {Number} [duration] Duration of change (in ms).\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used.\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n */\n function animateColor(fromColor, toColor, duration, options) {\n var startColor = new fabric.Color(fromColor).getSource(),\n endColor = new fabric.Color(toColor).getSource();\n\n options = options || {};\n\n fabric.util.animate(fabric.util.object.extend(options, {\n duration: duration || 500,\n startValue: startColor,\n endValue: endColor,\n byValue: endColor,\n easing: function (currentTime, startValue, byValue, duration) {\n var posValue = options.colorEasing\n ? options.colorEasing(currentTime, duration)\n : 1 - Math.cos(currentTime / duration * (Math.PI / 2));\n return calculateColor(startValue, byValue, posValue);\n }\n }));\n }\n\n fabric.util.animateColor = animateColor;\n\n})();\n\n\n(function() {\n\n function normalize(a, c, p, s) {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = p / (2 * Math.PI) * Math.asin(1);\n }\n else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n }\n return { a: a, c: c, p: p, s: s };\n }\n\n function elastic(opts, t, d) {\n return opts.a *\n Math.pow(2, 10 * (t -= 1)) *\n Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p );\n }\n\n /**\n * Cubic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCubic(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }\n\n /**\n * Cubic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCubic(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n\n /**\n * Quartic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuart(t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }\n\n /**\n * Quartic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuart(t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }\n\n /**\n * Quartic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuart(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t + b;\n }\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n\n /**\n * Quintic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuint(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }\n\n /**\n * Quintic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuint(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }\n\n /**\n * Quintic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuint(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n\n /**\n * Sinusoidal easing in\n * @memberOf fabric.util.ease\n */\n function easeInSine(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Sinusoidal easing out\n * @memberOf fabric.util.ease\n */\n function easeOutSine(t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }\n\n /**\n * Sinusoidal easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutSine(t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }\n\n /**\n * Exponential easing in\n * @memberOf fabric.util.ease\n */\n function easeInExpo(t, b, c, d) {\n return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }\n\n /**\n * Exponential easing out\n * @memberOf fabric.util.ease\n */\n function easeOutExpo(t, b, c, d) {\n return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }\n\n /**\n * Exponential easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutExpo(t, b, c, d) {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n }\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n\n /**\n * Circular easing in\n * @memberOf fabric.util.ease\n */\n function easeInCirc(t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }\n\n /**\n * Circular easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCirc(t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }\n\n /**\n * Circular easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCirc(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n }\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n\n /**\n * Elastic easing in\n * @memberOf fabric.util.ease\n */\n function easeInElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return -elastic(opts, t, d) + b;\n }\n\n /**\n * Elastic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b;\n }\n\n /**\n * Elastic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n var opts = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(opts, t, d) + b;\n }\n return opts.a * Math.pow(2, -10 * (t -= 1)) *\n Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b;\n }\n\n /**\n * Backwards easing in\n * @memberOf fabric.util.ease\n */\n function easeInBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }\n\n /**\n * Backwards easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n\n /**\n * Backwards easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n }\n return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n }\n\n /**\n * Bouncing easing in\n * @memberOf fabric.util.ease\n */\n function easeInBounce(t, b, c, d) {\n return c - easeOutBounce (d - t, 0, c, d) + b;\n }\n\n /**\n * Bouncing easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBounce(t, b, c, d) {\n if ((t /= d) < (1 / 2.75)) {\n return c * (7.5625 * t * t) + b;\n }\n else if (t < (2 / 2.75)) {\n return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b;\n }\n else if (t < (2.5 / 2.75)) {\n return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b;\n }\n else {\n return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b;\n }\n }\n\n /**\n * Bouncing easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBounce(t, b, c, d) {\n if (t < d / 2) {\n return easeInBounce (t * 2, 0, c, d) * 0.5 + b;\n }\n return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n }\n\n /**\n * Easing functions\n * See Easing Equations by Robert Penner\n * @namespace fabric.util.ease\n */\n fabric.util.ease = {\n\n /**\n * Quadratic easing in\n * @memberOf fabric.util.ease\n */\n easeInQuad: function(t, b, c, d) {\n return c * (t /= d) * t + b;\n },\n\n /**\n * Quadratic easing out\n * @memberOf fabric.util.ease\n */\n easeOutQuad: function(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n\n /**\n * Quadratic easing in and out\n * @memberOf fabric.util.ease\n */\n easeInOutQuad: function(t, b, c, d) {\n t /= (d / 2);\n if (t < 1) {\n return c / 2 * t * t + b;\n }\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n },\n\n /**\n * Cubic easing in\n * @memberOf fabric.util.ease\n */\n easeInCubic: function(t, b, c, d) {\n return c * (t /= d) * t * t + b;\n },\n\n easeOutCubic: easeOutCubic,\n easeInOutCubic: easeInOutCubic,\n easeInQuart: easeInQuart,\n easeOutQuart: easeOutQuart,\n easeInOutQuart: easeInOutQuart,\n easeInQuint: easeInQuint,\n easeOutQuint: easeOutQuint,\n easeInOutQuint: easeInOutQuint,\n easeInSine: easeInSine,\n easeOutSine: easeOutSine,\n easeInOutSine: easeInOutSine,\n easeInExpo: easeInExpo,\n easeOutExpo: easeOutExpo,\n easeInOutExpo: easeInOutExpo,\n easeInCirc: easeInCirc,\n easeOutCirc: easeOutCirc,\n easeInOutCirc: easeInOutCirc,\n easeInElastic: easeInElastic,\n easeOutElastic: easeOutElastic,\n easeInOutElastic: easeInOutElastic,\n easeInBack: easeInBack,\n easeOutBack: easeOutBack,\n easeInOutBack: easeInOutBack,\n easeInBounce: easeInBounce,\n easeOutBounce: easeOutBounce,\n easeInOutBounce: easeInOutBounce\n };\n\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n /**\n * @name fabric\n * @namespace\n */\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n parseUnit = fabric.util.parseUnit,\n multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,\n\n svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',\n 'image', 'text'],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n\n attributesMap = {\n cx: 'left',\n x: 'left',\n r: 'radius',\n cy: 'top',\n y: 'top',\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform'\n },\n\n colorAttributes = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity'\n };\n\n fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n fabric.cssRules = { };\n fabric.gradientDefs = { };\n fabric.clipPaths = { };\n\n function normalizeAttr(attr) {\n // transform attribute names\n if (attr in attributesMap) {\n return attributesMap[attr];\n }\n return attr;\n }\n\n function normalizeValue(attr, value, parentAttributes, fontSize) {\n var isArray = Object.prototype.toString.call(value) === '[object Array]',\n parsed;\n\n if ((attr === 'fill' || attr === 'stroke') && value === 'none') {\n value = '';\n }\n else if (attr === 'vector-effect') {\n value = value === 'non-scaling-stroke';\n }\n else if (attr === 'strokeDashArray') {\n if (value === 'none') {\n value = null;\n }\n else {\n value = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n }\n else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n value = multiplyTransformMatrices(\n parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));\n }\n else {\n value = fabric.parseTransformAttribute(value);\n }\n }\n else if (attr === 'visible') {\n value = value !== 'none' && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n value = false;\n }\n }\n else if (attr === 'opacity') {\n value = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n value *= parentAttributes.opacity;\n }\n }\n else if (attr === 'textAnchor' /* text-anchor */) {\n value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';\n }\n else if (attr === 'charSpacing') {\n // parseUnit returns px and we convert it to em\n parsed = parseUnit(value, fontSize) / fontSize * 1000;\n }\n else if (attr === 'paintFirst') {\n var fillIndex = value.indexOf('fill');\n var strokeIndex = value.indexOf('stroke');\n var value = 'fill';\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n value = 'stroke';\n }\n else if (fillIndex === -1 && strokeIndex > -1) {\n value = 'stroke';\n }\n }\n else if (attr === 'href' || attr === 'xlink:href') {\n return value;\n }\n else {\n parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);\n }\n\n return (!isArray && isNaN(parsed) ? value : parsed);\n }\n\n /**\n * @private\n */\n function getSvgRegex(arr) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n }\n\n /**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n function _setStrokeFillOpacity(attributes) {\n for (var attr in colorAttributes) {\n\n if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {\n continue;\n }\n\n if (typeof attributes[attr] === 'undefined') {\n if (!fabric.Object.prototype[attr]) {\n continue;\n }\n attributes[attr] = fabric.Object.prototype[attr];\n }\n\n if (attributes[attr].indexOf('url(') === 0) {\n continue;\n }\n\n var color = new fabric.Color(attributes[attr]);\n attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();\n }\n return attributes;\n }\n\n /**\n * @private\n */\n function _getMultipleNodes(doc, nodeNames) {\n var nodeName, nodeArray = [], nodeList, i, len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagName(nodeName);\n nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));\n }\n return nodeArray;\n }\n\n /**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @memberOf fabric\n * @param {String} attributeValue String containing attribute value\n * @return {Array} Array of 6 elements representing transformation matrix\n */\n fabric.parseTransformAttribute = (function() {\n function rotateMatrix(matrix, args) {\n var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),\n x = 0, y = 0;\n if (args.length === 3) {\n x = args[1];\n y = args[2];\n }\n\n matrix[0] = cos;\n matrix[1] = sin;\n matrix[2] = -sin;\n matrix[3] = cos;\n matrix[4] = x - (cos * x - sin * y);\n matrix[5] = y - (sin * x + cos * y);\n }\n\n function scaleMatrix(matrix, args) {\n var multiplierX = args[0],\n multiplierY = (args.length === 2) ? args[1] : args[0];\n\n matrix[0] = multiplierX;\n matrix[3] = multiplierY;\n }\n\n function skewMatrix(matrix, args, pos) {\n matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));\n }\n\n function translateMatrix(matrix, args) {\n matrix[4] = args[0];\n if (args.length === 2) {\n matrix[5] = args[1];\n }\n }\n\n // identity matrix\n var iMatrix = fabric.iMatrix,\n\n // == begin transform regexp\n number = fabric.reNum,\n\n commaWsp = '(?:\\\\s+,?\\\\s*|,\\\\s*)',\n\n skewX = '(?:(skewX)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n skewY = '(?:(skewY)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n rotate = '(?:(rotate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + ')' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n scale = '(?:(scale)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n translate = '(?:(translate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n matrix = '(?:(matrix)\\\\s*\\\\(\\\\s*' +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' +\n '\\\\s*\\\\))',\n\n transform = '(?:' +\n matrix + '|' +\n translate + '|' +\n scale + '|' +\n rotate + '|' +\n skewX + '|' +\n skewY +\n ')',\n\n transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',\n\n transformList = '^\\\\s*(?:' + transforms + '?)\\\\s*$',\n\n // http://www.w3.org/TR/SVG/coords.html#TransformAttribute\n reTransformList = new RegExp(transformList),\n // == end transform regexp\n\n reTransform = new RegExp(transform, 'g');\n\n return function(attributeValue) {\n\n // start with identity matrix\n var matrix = iMatrix.concat(),\n matrices = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {\n return matrix;\n }\n\n attributeValue.replace(reTransform, function(match) {\n\n var m = new RegExp(transform).exec(match).filter(function (match) {\n // match !== '' && match != null\n return (!!match);\n }),\n operation = m[1],\n args = m.slice(2).map(parseFloat);\n\n switch (operation) {\n case 'translate':\n translateMatrix(matrix, args);\n break;\n case 'rotate':\n args[0] = fabric.util.degreesToRadians(args[0]);\n rotateMatrix(matrix, args);\n break;\n case 'scale':\n scaleMatrix(matrix, args);\n break;\n case 'skewX':\n skewMatrix(matrix, args, 2);\n break;\n case 'skewY':\n skewMatrix(matrix, args, 1);\n break;\n case 'matrix':\n matrix = args;\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix.concat());\n // reset\n matrix = iMatrix.concat();\n });\n\n var combinedMatrix = matrices[0];\n while (matrices.length > 1) {\n matrices.shift();\n combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);\n }\n return combinedMatrix;\n };\n })();\n\n /**\n * @private\n */\n function parseStyleString(style, oStyle) {\n var attr, value;\n style.replace(/;\\s*$/, '').split(';').forEach(function (chunk) {\n var pair = chunk.split(':');\n\n attr = pair[0].trim().toLowerCase();\n value = pair[1].trim();\n\n oStyle[attr] = value;\n });\n }\n\n /**\n * @private\n */\n function parseStyleObject(style, oStyle) {\n var attr, value;\n for (var prop in style) {\n if (typeof style[prop] === 'undefined') {\n continue;\n }\n\n attr = prop.toLowerCase();\n value = style[prop];\n\n oStyle[attr] = value;\n }\n }\n\n /**\n * @private\n */\n function getGlobalStylesForElement(element, svgUid) {\n var styles = { };\n for (var rule in fabric.cssRules[svgUid]) {\n if (elementMatchesRule(element, rule.split(' '))) {\n for (var property in fabric.cssRules[svgUid][rule]) {\n styles[property] = fabric.cssRules[svgUid][rule][property];\n }\n }\n }\n return styles;\n }\n\n /**\n * @private\n */\n function elementMatchesRule(element, selectors) {\n var firstMatching, parentMatching = true;\n //start from rightmost selector.\n firstMatching = selectorMatches(element, selectors.pop());\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && (selectors.length === 0);\n }\n\n function doesSomeParentMatch(element, selectors) {\n var selector, parentMatching = true;\n while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {\n if (parentMatching) {\n selector = selectors.pop();\n }\n element = element.parentNode;\n parentMatching = selectorMatches(element, selector);\n }\n return selectors.length === 0;\n }\n\n /**\n * @private\n */\n function selectorMatches(element, selector) {\n var nodeName = element.nodeName,\n classNames = element.getAttribute('class'),\n id = element.getAttribute('id'), matcher, i;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n classNames = classNames.split(' ');\n for (i = classNames.length; i--;) {\n matcher = new RegExp('\\\\.' + classNames[i] + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n }\n\n /**\n * @private\n * to support IE8 missing getElementById on SVGdocument and on node xmlDOM\n */\n function elementById(doc, id) {\n var el;\n doc.getElementById && (el = doc.getElementById(id));\n if (el) {\n return el;\n }\n var node, i, len, nodelist = doc.getElementsByTagName('*');\n for (i = 0, len = nodelist.length; i < len; i++) {\n node = nodelist[i];\n if (id === node.getAttribute('id')) {\n return node;\n }\n }\n }\n\n /**\n * @private\n */\n function parseUseDirectives(doc) {\n var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;\n while (nodelist.length && i < nodelist.length) {\n var el = nodelist[i],\n xlink = (el.getAttribute('xlink:href') || el.getAttribute('href')).substr(1),\n x = el.getAttribute('x') || 0,\n y = el.getAttribute('y') || 0,\n el2 = elementById(doc, xlink).cloneNode(true),\n currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',\n parentNode, oldLength = nodelist.length, attr, j, attrs, len;\n\n applyViewboxTransform(el2);\n if (/^svg$/i.test(el2.nodeName)) {\n var el3 = el2.ownerDocument.createElement('g');\n for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n el3.setAttribute(attr.nodeName, attr.nodeValue);\n }\n // el2.firstChild != null\n while (el2.firstChild) {\n el3.appendChild(el2.firstChild);\n }\n el2 = el3;\n }\n\n for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n if (attr.nodeName === 'x' || attr.nodeName === 'y' ||\n attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {\n continue;\n }\n\n if (attr.nodeName === 'transform') {\n currentTrans = attr.nodeValue + ' ' + currentTrans;\n }\n else {\n el2.setAttribute(attr.nodeName, attr.nodeValue);\n }\n }\n\n el2.setAttribute('transform', currentTrans);\n el2.setAttribute('instantiated_by_use', '1');\n el2.removeAttribute('id');\n parentNode = el.parentNode;\n parentNode.replaceChild(el2, el);\n // some browsers do not shorten nodelist after replaceChild (IE8)\n if (nodelist.length === oldLength) {\n i++;\n }\n }\n }\n\n // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n // matches, e.g.: +14.56e-12, etc.\n var reViewBoxAttrValue = new RegExp(\n '^' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*' +\n '$'\n );\n\n /**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\n function applyViewboxTransform(element) {\n\n var viewBoxAttr = element.getAttribute('viewBox'),\n scaleX = 1,\n scaleY = 1,\n minX = 0,\n minY = 0,\n viewBoxWidth, viewBoxHeight, matrix, el,\n widthAttr = element.getAttribute('width'),\n heightAttr = element.getAttribute('height'),\n x = element.getAttribute('x') || 0,\n y = element.getAttribute('y') || 0,\n preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',\n missingViewBox = (!viewBoxAttr || !fabric.svgViewBoxElementsRegEx.test(element.nodeName)\n || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),\n missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),\n toBeParsed = missingViewBox && missingDimAttr,\n parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;\n\n parsedDim.width = 0;\n parsedDim.height = 0;\n parsedDim.toBeParsed = toBeParsed;\n\n if (toBeParsed) {\n return parsedDim;\n }\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n return parsedDim;\n }\n minX = -parseFloat(viewBoxAttr[1]);\n minY = -parseFloat(viewBoxAttr[2]);\n viewBoxWidth = parseFloat(viewBoxAttr[3]);\n viewBoxHeight = parseFloat(viewBoxAttr[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n }\n else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);\n if (preserveAspectRatio.alignX !== 'none') {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {\n return parsedDim;\n }\n\n if (x || y) {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n }\n\n matrix = translateMatrix + ' matrix(' + scaleX +\n ' 0' +\n ' 0 ' +\n scaleY + ' ' +\n (minX * scaleX + widthDiff) + ' ' +\n (minY * scaleY + heightDiff) + ') ';\n parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElement('g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n }\n else {\n el = element;\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n }\n\n function hasAncestorWithNodeName(element, nodeName) {\n while (element && (element = element.parentNode)) {\n if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))\n && !element.getAttribute('instantiated_by_use')) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @param {Function} callback Callback to call when parsing is finished;\n * It's being passed an array of elements (parsed from a document).\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [parsingOptions] options for parsing document\n * @param {String} [parsingOptions.crossOrigin] crossOrigin settings\n */\n fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {\n if (!doc) {\n return;\n }\n\n parseUseDirectives(doc);\n\n var svgUid = fabric.Object.__uid++, i, len,\n options = applyViewboxTransform(doc),\n descendants = fabric.util.toArray(doc.getElementsByTagName('*'));\n options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;\n options.svgUid = svgUid;\n\n if (descendants.length === 0 && fabric.isLikelyNode) {\n // we're likely in node, where \"o3-xml\" library fails to gEBTN(\"*\")\n // https://github.com/ajaxorg/node-o3-xml/issues/21\n descendants = doc.selectNodes('//*[name(.)!=\"svg\"]');\n var arr = [];\n for (i = 0, len = descendants.length; i < len; i++) {\n arr[i] = descendants[i];\n }\n descendants = arr;\n }\n\n var elements = descendants.filter(function(el) {\n applyViewboxTransform(el);\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&\n !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n\n if (!elements || (elements && !elements.length)) {\n callback && callback([], {});\n return;\n }\n var clipPaths = { };\n descendants.filter(function(el) {\n return el.nodeName.replace('svg:', '') === 'clipPath';\n }).forEach(function(el) {\n var id = el.getAttribute('id');\n clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));\n });\n });\n fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);\n fabric.cssRules[svgUid] = fabric.getCSSRules(doc);\n fabric.clipPaths[svgUid] = clipPaths;\n // Precedence of rules: style > class > attribute\n fabric.parseElements(elements, function(instances, elements) {\n if (callback) {\n callback(instances, options, elements, descendants);\n delete fabric.gradientDefs[svgUid];\n delete fabric.cssRules[svgUid];\n delete fabric.clipPaths[svgUid];\n }\n }, clone(options), reviver, parsingOptions);\n };\n\n function recursivelyParseGradientsXlink(doc, gradient) {\n var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],\n xlinkAttr = 'xlink:href',\n xLink = gradient.getAttribute(xlinkAttr).substr(1),\n referencedGradient = elementById(doc, xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient);\n }\n gradientsAttrs.forEach(function(attr) {\n if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {\n gradient.setAttribute(attr, referencedGradient.getAttribute(attr));\n }\n });\n if (!gradient.children.length) {\n var referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n gradient.removeAttribute(xlinkAttr);\n }\n\n var reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n fabric.reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' + fabric.reNum + '))?\\\\s+(.*)');\n\n extend(fabric, {\n /**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @memberOf fabric\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\n parseFontDeclaration: function(value, oStyle) {\n var match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n var fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n },\n\n /**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\n getGradientDefs: function(doc) {\n var tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient'],\n elList = _getMultipleNodes(doc, tagArray),\n el, j = 0, gradientDefs = { };\n j = elList.length;\n while (j--) {\n el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n gradientDefs[el.getAttribute('id')] = el;\n }\n return gradientDefs;\n },\n\n /**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @static\n * @memberOf fabric\n * @param {DOMElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\n parseAttributes: function(element, attributes, svgUid) {\n\n if (!element) {\n return;\n }\n\n var value,\n parentAttributes = { },\n fontSize, parentFontSize;\n\n if (typeof svgUid === 'undefined') {\n svgUid = element.getAttribute('svgUid');\n }\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {\n parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);\n }\n\n var ownAttributes = attributes.reduce(function(memo, attr) {\n value = element.getAttribute(attr);\n if (value) { // eslint-disable-line\n memo[attr] = value;\n }\n return memo;\n }, { });\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n ownAttributes = extend(ownAttributes,\n extend(getGlobalStylesForElement(element, svgUid), fabric.parseStyleAttribute(element)));\n\n fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;\n if (ownAttributes['font-size']) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n ownAttributes['font-size'] = fontSize = parseUnit(ownAttributes['font-size'], parentFontSize);\n }\n\n var normalizedAttr, normalizedValue, normalizedStyle = {};\n for (var attr in ownAttributes) {\n normalizedAttr = normalizeAttr(attr);\n normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);\n }\n var mergedAttrs = extend(parentAttributes, normalizedStyle);\n return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);\n },\n\n /**\n * Transforms an array of svg elements to corresponding fabric.* instances\n * @static\n * @memberOf fabric\n * @param {Array} elements Array of elements to parse\n * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)\n * @param {Object} [options] Options object\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n */\n parseElements: function(elements, callback, options, reviver, parsingOptions) {\n new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();\n },\n\n /**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @memberOf fabric\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\n parseStyleAttribute: function(element) {\n var oStyle = { },\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n }\n else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n },\n\n /**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @memberOf fabric\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\n parsePointsAttribute: function(points) {\n\n // points attribute is required and must not be empty\n if (!points) {\n return null;\n }\n\n // replace commas with whitespace and remove bookending whitespace\n points = points.replace(/,/g, ' ').trim();\n\n points = points.split(/\\s+/);\n var parsedPoints = [], i, len;\n\n for (i = 0, len = points.length; i < len; i += 2) {\n parsedPoints.push({\n x: parseFloat(points[i]),\n y: parseFloat(points[i + 1])\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n\n return parsedPoints;\n },\n\n /**\n * Returns CSS rules for a given SVG document\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\n getCSSRules: function(doc) {\n var styles = doc.getElementsByTagName('style'), i, len,\n allRules = { }, rules;\n\n // very crude parsing of style contents\n for (i = 0, len = styles.length; i < len; i++) {\n // IE9 doesn't support textContent, but provides text instead.\n var styleContents = styles[i].textContent || styles[i].text;\n\n // remove comments\n styleContents = styleContents.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n if (styleContents.trim() === '') {\n continue;\n }\n rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n rules = rules.map(function(rule) { return rule.trim(); });\n // eslint-disable-next-line no-loop-func\n rules.forEach(function(rule) {\n\n var match = rule.match(/([\\s\\S]*?)\\s*\\{([^}]*)\\}/),\n ruleObj = { }, declaration = match[2].trim(),\n propertyValuePairs = declaration.replace(/;$/, '').split(/\\s*;\\s*/);\n\n for (i = 0, len = propertyValuePairs.length; i < len; i++) {\n var pair = propertyValuePairs[i].split(/\\s*:\\s*/),\n property = pair[0],\n value = pair[1];\n ruleObj[property] = value;\n }\n rule = match[1];\n rule.split(',').forEach(function(_rule) {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n if (allRules[_rule]) {\n fabric.util.object.extend(allRules[_rule], ruleObj);\n }\n else {\n allRules[_rule] = fabric.util.object.clone(ruleObj);\n }\n });\n });\n }\n return allRules;\n },\n\n /**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)\n * @memberOf fabric\n * @param {String} url\n * @param {Function} callback\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n */\n loadSVGFromURL: function(url, callback, reviver, options) {\n\n url = url.replace(/^\\n\\s*/, '').trim();\n new fabric.util.request(url, {\n method: 'get',\n onComplete: onComplete\n });\n\n function onComplete(r) {\n\n var xml = r.responseXML;\n if (xml && !xml.documentElement && fabric.window.ActiveXObject && r.responseText) {\n xml = new ActiveXObject('Microsoft.XMLDOM');\n xml.async = 'false';\n //IE chokes on DOCTYPE\n xml.loadXML(r.responseText.replace(//i, ''));\n }\n if (!xml || !xml.documentElement) {\n callback && callback(null);\n return false;\n }\n\n fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) {\n callback && callback(results, _options, elements, allElements);\n }, reviver, options);\n }\n },\n\n /**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @memberOf fabric\n * @param {String} string\n * @param {Function} callback\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n */\n loadSVGFromString: function(string, callback, reviver, options) {\n string = string.trim();\n var doc;\n if (typeof fabric.window.DOMParser !== 'undefined') {\n var parser = new fabric.window.DOMParser();\n if (parser && parser.parseFromString) {\n doc = parser.parseFromString(string, 'text/xml');\n }\n }\n else if (fabric.window.ActiveXObject) {\n doc = new ActiveXObject('Microsoft.XMLDOM');\n doc.async = 'false';\n // IE chokes on DOCTYPE\n doc.loadXML(string.replace(//i, ''));\n }\n\n fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) {\n callback(results, _options, elements, allElements);\n }, reviver, options);\n }\n });\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions) {\n this.elements = elements;\n this.callback = callback;\n this.options = options;\n this.reviver = reviver;\n this.svgUid = (options && options.svgUid) || 0;\n this.parsingOptions = parsingOptions;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n};\n\n(function(proto) {\n proto.parse = function() {\n this.instances = new Array(this.elements.length);\n this.numElements = this.elements.length;\n this.createObjects();\n };\n\n proto.createObjects = function() {\n var _this = this;\n this.elements.forEach(function(element, i) {\n element.setAttribute('svgUid', _this.svgUid);\n _this.createObject(element, i);\n });\n };\n\n proto.findTag = function(el) {\n return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))];\n };\n\n proto.createObject = function(el, index) {\n var klass = this.findTag(el);\n if (klass && klass.fromElement) {\n try {\n klass.fromElement(el, this.createCallback(index, el), this.options);\n }\n catch (err) {\n fabric.log(err);\n }\n }\n else {\n this.checkIfDone();\n }\n };\n\n proto.createCallback = function(index, el) {\n var _this = this;\n return function(obj) {\n var _options;\n _this.resolveGradient(obj, el, 'fill');\n _this.resolveGradient(obj, el, 'stroke');\n if (obj instanceof fabric.Image && obj._originalElement) {\n _options = obj.parsePreserveAspectRatioAttribute(el);\n }\n obj._removeTransformMatrix(_options);\n _this.resolveClipPath(obj);\n _this.reviver && _this.reviver(el, obj);\n _this.instances[index] = obj;\n _this.checkIfDone();\n };\n };\n\n proto.extractPropertyDefinition = function(obj, property, storage) {\n var value = obj[property];\n if (!(/^url\\(/).test(value)) {\n return;\n }\n var id = this.regexUrl.exec(value)[1];\n this.regexUrl.lastIndex = 0;\n return fabric[storage][this.svgUid][id];\n };\n\n proto.resolveGradient = function(obj, el, property) {\n var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs');\n if (gradientDef) {\n var opacityAttr = el.getAttribute(property + '-opacity');\n var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options);\n obj.set(property, gradient);\n }\n };\n\n proto.createClipPathCallback = function(obj, container) {\n return function(_newObj) {\n _newObj._removeTransformMatrix();\n _newObj.fillRule = _newObj.clipRule;\n container.push(_newObj);\n };\n };\n\n proto.resolveClipPath = function(obj) {\n var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'),\n element, klass, objTransformInv, container, gTransform, options;\n if (clipPath) {\n container = [];\n objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix());\n for (var i = 0; i < clipPath.length; i++) {\n element = clipPath[i];\n klass = this.findTag(element);\n klass.fromElement(\n element,\n this.createClipPathCallback(obj, container),\n this.options\n );\n }\n if (container.length === 1) {\n clipPath = container[0];\n }\n else {\n clipPath = new fabric.Group(container);\n }\n gTransform = fabric.util.multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix()\n );\n var options = fabric.util.qrDecompose(gTransform);\n clipPath.flipX = false;\n clipPath.flipY = false;\n clipPath.set('scaleX', options.scaleX);\n clipPath.set('scaleY', options.scaleY);\n clipPath.angle = options.angle;\n clipPath.skewX = options.skewX;\n clipPath.skewY = 0;\n clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center');\n obj.clipPath = clipPath;\n }\n };\n\n proto.checkIfDone = function() {\n if (--this.numElements === 0) {\n this.instances = this.instances.filter(function(el) {\n // eslint-disable-next-line no-eq-null, eqeqeq\n return el != null;\n });\n this.callback(this.instances, this.elements);\n }\n };\n})(fabric.ElementsParser.prototype);\n\n\n(function(global) {\n\n 'use strict';\n\n /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Point) {\n fabric.warn('fabric.Point is already defined');\n return;\n }\n\n fabric.Point = Point;\n\n /**\n * Point class\n * @class fabric.Point\n * @memberOf fabric\n * @constructor\n * @param {Number} x\n * @param {Number} y\n * @return {fabric.Point} thisArg\n */\n function Point(x, y) {\n this.x = x;\n this.y = y;\n }\n\n Point.prototype = /** @lends fabric.Point.prototype */ {\n\n type: 'point',\n\n constructor: Point,\n\n /**\n * Adds another point to this one and returns another one\n * @param {fabric.Point} that\n * @return {fabric.Point} new Point instance with added values\n */\n add: function (that) {\n return new Point(this.x + that.x, this.y + that.y);\n },\n\n /**\n * Adds another point to this one\n * @param {fabric.Point} that\n * @return {fabric.Point} thisArg\n * @chainable\n */\n addEquals: function (that) {\n this.x += that.x;\n this.y += that.y;\n return this;\n },\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {fabric.Point} new Point with added value\n */\n scalarAdd: function (scalar) {\n return new Point(this.x + scalar, this.y + scalar);\n },\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n scalarAddEquals: function (scalar) {\n this.x += scalar;\n this.y += scalar;\n return this;\n },\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {fabric.Point} that\n * @return {fabric.Point} new Point object with subtracted values\n */\n subtract: function (that) {\n return new Point(this.x - that.x, this.y - that.y);\n },\n\n /**\n * Subtracts another point from this point\n * @param {fabric.Point} that\n * @return {fabric.Point} thisArg\n * @chainable\n */\n subtractEquals: function (that) {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n },\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n scalarSubtract: function (scalar) {\n return new Point(this.x - scalar, this.y - scalar);\n },\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n scalarSubtractEquals: function (scalar) {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n },\n\n /**\n * Multiplies this point by a value and returns a new one\n * TODO: rename in scalarMultiply in 2.0\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n multiply: function (scalar) {\n return new Point(this.x * scalar, this.y * scalar);\n },\n\n /**\n * Multiplies this point by a value\n * TODO: rename in scalarMultiplyEquals in 2.0\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n multiplyEquals: function (scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n },\n\n /**\n * Divides this point by a value and returns a new one\n * TODO: rename in scalarDivide in 2.0\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n divide: function (scalar) {\n return new Point(this.x / scalar, this.y / scalar);\n },\n\n /**\n * Divides this point by a value\n * TODO: rename in scalarDivideEquals in 2.0\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n divideEquals: function (scalar) {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n },\n\n /**\n * Returns true if this point is equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n eq: function (that) {\n return (this.x === that.x && this.y === that.y);\n },\n\n /**\n * Returns true if this point is less than another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n lt: function (that) {\n return (this.x < that.x && this.y < that.y);\n },\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n lte: function (that) {\n return (this.x <= that.x && this.y <= that.y);\n },\n\n /**\n\n * Returns true if this point is greater another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n gt: function (that) {\n return (this.x > that.x && this.y > that.y);\n },\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n gte: function (that) {\n return (this.x >= that.x && this.y >= that.y);\n },\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {fabric.Point} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {fabric.Point}\n */\n lerp: function (that, t) {\n if (typeof t === 'undefined') {\n t = 0.5;\n }\n t = Math.max(Math.min(1, t), 0);\n return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t);\n },\n\n /**\n * Returns distance from this point and another one\n * @param {fabric.Point} that\n * @return {Number}\n */\n distanceFrom: function (that) {\n var dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /**\n * Returns the point between this point and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n midPointFrom: function (that) {\n return this.lerp(that);\n },\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n min: function (that) {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n },\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n max: function (that) {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n },\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString: function () {\n return this.x + ',' + this.y;\n },\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n * @chainable\n */\n setXY: function (x, y) {\n this.x = x;\n this.y = y;\n return this;\n },\n\n /**\n * Sets x of this point\n * @param {Number} x\n * @chainable\n */\n setX: function (x) {\n this.x = x;\n return this;\n },\n\n /**\n * Sets y of this point\n * @param {Number} y\n * @chainable\n */\n setY: function (y) {\n this.y = y;\n return this;\n },\n\n /**\n * Sets x/y of this point from another point\n * @param {fabric.Point} that\n * @chainable\n */\n setFromPoint: function (that) {\n this.x = that.x;\n this.y = that.y;\n return this;\n },\n\n /**\n * Swaps x/y of this point and another point\n * @param {fabric.Point} that\n */\n swap: function (that) {\n var x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n },\n\n /**\n * return a cloned instance of the point\n * @return {fabric.Point}\n */\n clone: function () {\n return new Point(this.x, this.y);\n }\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Intersection) {\n fabric.warn('fabric.Intersection is already defined');\n return;\n }\n\n /**\n * Intersection class\n * @class fabric.Intersection\n * @memberOf fabric\n * @constructor\n */\n function Intersection(status) {\n this.status = status;\n this.points = [];\n }\n\n fabric.Intersection = Intersection;\n\n fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ {\n\n constructor: Intersection,\n\n /**\n * Appends a point to intersection\n * @param {fabric.Point} point\n * @return {fabric.Intersection} thisArg\n * @chainable\n */\n appendPoint: function (point) {\n this.points.push(point);\n return this;\n },\n\n /**\n * Appends points to intersection\n * @param {Array} points\n * @return {fabric.Intersection} thisArg\n * @chainable\n */\n appendPoints: function (points) {\n this.points = this.points.concat(points);\n return this;\n }\n };\n\n /**\n * Checks if one line intersects another\n * TODO: rename in intersectSegmentSegment\n * @static\n * @param {fabric.Point} a1\n * @param {fabric.Point} a2\n * @param {fabric.Point} b1\n * @param {fabric.Point} b2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) {\n var result,\n uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),\n ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),\n uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n if (uB !== 0) {\n var ua = uaT / uB,\n ub = ubT / uB;\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection('Intersection');\n result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y)));\n }\n else {\n result = new Intersection();\n }\n }\n else {\n if (uaT === 0 || ubT === 0) {\n result = new Intersection('Coincident');\n }\n else {\n result = new Intersection('Parallel');\n }\n }\n return result;\n };\n\n /**\n * Checks if line intersects polygon\n * TODO: rename in intersectSegmentPolygon\n * fix detection of coincident\n * @static\n * @param {fabric.Point} a1\n * @param {fabric.Point} a2\n * @param {Array} points\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectLinePolygon = function(a1, a2, points) {\n var result = new Intersection(),\n length = points.length,\n b1, b2, inter, i;\n\n for (i = 0; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n /**\n * Checks if polygon intersects another polygon\n * @static\n * @param {Array} points1\n * @param {Array} points2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectPolygonPolygon = function (points1, points2) {\n var result = new Intersection(),\n length = points1.length, i;\n\n for (i = 0; i < length; i++) {\n var a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectLinePolygon(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n /**\n * Checks if polygon intersects rectangle\n * @static\n * @param {Array} points\n * @param {fabric.Point} r1\n * @param {fabric.Point} r2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) {\n var min = r1.min(r2),\n max = r1.max(r2),\n topRight = new fabric.Point(max.x, min.y),\n bottomLeft = new fabric.Point(min.x, max.y),\n inter1 = Intersection.intersectLinePolygon(min, topRight, points),\n inter2 = Intersection.intersectLinePolygon(topRight, max, points),\n inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points),\n inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points),\n result = new Intersection();\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Color) {\n fabric.warn('fabric.Color is already defined.');\n return;\n }\n\n /**\n * Color class\n * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations;\n * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects.\n *\n * @class fabric.Color\n * @param {String} color optional in hex or rgb(a) or hsl format or from known color list\n * @return {fabric.Color} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors}\n */\n function Color(color) {\n if (!color) {\n this.setSource([0, 0, 0, 1]);\n }\n else {\n this._tryParsingColor(color);\n }\n }\n\n fabric.Color = Color;\n\n fabric.Color.prototype = /** @lends fabric.Color.prototype */ {\n\n /**\n * @private\n * @param {String|Array} color Color value to parse\n */\n _tryParsingColor: function(color) {\n var source;\n\n if (color in Color.colorNameMap) {\n color = Color.colorNameMap[color];\n }\n\n if (color === 'transparent') {\n source = [255, 255, 255, 0];\n }\n\n if (!source) {\n source = Color.sourceFromHex(color);\n }\n if (!source) {\n source = Color.sourceFromRgb(color);\n }\n if (!source) {\n source = Color.sourceFromHsl(color);\n }\n if (!source) {\n //if color is not recognize let's make black as canvas does\n source = [0, 0, 0, 1];\n }\n if (source) {\n this.setSource(source);\n }\n },\n\n /**\n * Adapted from https://github.com/mjijackson\n * @private\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @return {Array} Hsl color\n */\n _rgbToHsl: function(r, g, b) {\n r /= 255; g /= 255; b /= 255;\n\n var h, s, l,\n max = fabric.util.array.max([r, g, b]),\n min = fabric.util.array.min([r, g, b]);\n\n l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [\n Math.round(h * 360),\n Math.round(s * 100),\n Math.round(l * 100)\n ];\n },\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {Array}\n */\n getSource: function() {\n return this._source;\n },\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {Array} source\n */\n setSource: function(source) {\n this._source = source;\n },\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb: function() {\n var source = this.getSource();\n return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')';\n },\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba: function() {\n var source = this.getSource();\n return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')';\n },\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl: function() {\n var source = this.getSource(),\n hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)';\n },\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla: function() {\n var source = this.getSource(),\n hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')';\n },\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex: function() {\n var source = this.getSource(), r, g, b;\n\n r = source[0].toString(16);\n r = (r.length === 1) ? ('0' + r) : r;\n\n g = source[1].toString(16);\n g = (g.length === 1) ? ('0' + g) : g;\n\n b = source[2].toString(16);\n b = (b.length === 1) ? ('0' + b) : b;\n\n return r.toUpperCase() + g.toUpperCase() + b.toUpperCase();\n },\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa: function() {\n var source = this.getSource(), a;\n\n a = Math.round(source[3] * 255);\n a = a.toString(16);\n a = (a.length === 1) ? ('0' + a) : a;\n\n return this.toHex() + a.toUpperCase();\n },\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha: function() {\n return this.getSource()[3];\n },\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {fabric.Color} thisArg\n */\n setAlpha: function(alpha) {\n var source = this.getSource();\n source[3] = alpha;\n this.setSource(source);\n return this;\n },\n\n /**\n * Transforms color to its grayscale representation\n * @return {fabric.Color} thisArg\n */\n toGrayscale: function() {\n var source = this.getSource(),\n average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10),\n currentAlpha = source[3];\n this.setSource([average, average, average, currentAlpha]);\n return this;\n },\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {fabric.Color} thisArg\n */\n toBlackWhite: function(threshold) {\n var source = this.getSource(),\n average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0),\n currentAlpha = source[3];\n\n threshold = threshold || 127;\n\n average = (Number(average) < Number(threshold)) ? 0 : 255;\n this.setSource([average, average, average, currentAlpha]);\n return this;\n },\n\n /**\n * Overlays color with another color\n * @param {String|fabric.Color} otherColor\n * @return {fabric.Color} thisArg\n */\n overlayWith: function(otherColor) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n var result = [],\n alpha = this.getAlpha(),\n otherAlpha = 0.5,\n source = this.getSource(),\n otherSource = otherColor.getSource(), i;\n\n for (i = 0; i < 3; i++) {\n result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)));\n }\n\n result[3] = alpha;\n this.setSource(result);\n return this;\n }\n };\n\n /**\n * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * @static\n * @field\n * @memberOf fabric.Color\n */\n // eslint-disable-next-line max-len\n fabric.Color.reRGBa = /^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*((?:\\d*\\.?\\d+)?)\\s*)?\\)$/i;\n\n /**\n * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 ))\n * @static\n * @field\n * @memberOf fabric.Color\n */\n fabric.Color.reHSLa = /^hsla?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3}\\%)\\s*,\\s*(\\d{1,3}\\%)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$/i;\n\n /**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n * @static\n * @field\n * @memberOf fabric.Color\n */\n fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n\n /**\n * Map of the 148 color names with HEX code\n * @static\n * @field\n * @memberOf fabric.Color\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\n fabric.Color.colorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#00FFFF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000000',\n blanchedalmond: '#FFEBCD',\n blue: '#0000FF',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#00FFFF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#FF00FF',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#00FF00',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#FF00FF',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#FF0000',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFFFFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FFFF00',\n yellowgreen: '#9ACD32'\n };\n\n /**\n * @private\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\n function hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @memberOf fabric.Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {fabric.Color}\n */\n fabric.Color.fromRgb = function(color) {\n return Color.fromSource(Color.sourceFromRgb(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @memberOf fabric.Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {Array} source\n */\n fabric.Color.sourceFromRgb = function(color) {\n var match = color.match(Color.reRGBa);\n if (match) {\n var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1),\n g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1),\n b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1);\n\n return [\n parseInt(r, 10),\n parseInt(g, 10),\n parseInt(b, 10),\n match[4] ? parseFloat(match[4]) : 1\n ];\n }\n };\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @static\n * @function\n * @memberOf fabric.Color\n * @param {String} color\n * @return {fabric.Color}\n */\n fabric.Color.fromRgba = Color.fromRgb;\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @memberOf fabric.Color\n * @return {fabric.Color}\n */\n fabric.Color.fromHsl = function(color) {\n return Color.fromSource(Color.sourceFromHsl(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @memberOf fabric.Color\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {Array} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n fabric.Color.sourceFromHsl = function(color) {\n var match = color.match(Color.reHSLa);\n if (!match) {\n return;\n }\n\n var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1),\n l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1),\n r, g, b;\n\n if (s === 0) {\n r = g = b = l;\n }\n else {\n var q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n match[4] ? parseFloat(match[4]) : 1\n ];\n };\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @static\n * @function\n * @memberOf fabric.Color\n * @param {String} color\n * @return {fabric.Color}\n */\n fabric.Color.fromHsla = Color.fromHsl;\n\n /**\n * Returns new color object, when given a color in HEX format\n * @static\n * @memberOf fabric.Color\n * @param {String} color Color value ex: FF5555\n * @return {fabric.Color}\n */\n fabric.Color.fromHex = function(color) {\n return Color.fromSource(Color.sourceFromHex(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @static\n * @memberOf fabric.Color\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {Array} source\n */\n fabric.Color.sourceFromHex = function(color) {\n if (color.match(Color.reHex)) {\n var value = color.slice(color.indexOf('#') + 1),\n isShortNotation = (value.length === 3 || value.length === 4),\n isRGBa = (value.length === 8 || value.length === 4),\n r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2),\n g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4),\n b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6),\n a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF';\n\n return [\n parseInt(r, 16),\n parseInt(g, 16),\n parseInt(b, 16),\n parseFloat((parseInt(a, 16) / 255).toFixed(2))\n ];\n }\n };\n\n /**\n * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])\n * @static\n * @memberOf fabric.Color\n * @param {Array} source\n * @return {fabric.Color}\n */\n fabric.Color.fromSource = function(source) {\n var oColor = new Color();\n oColor.setSource(source);\n return oColor;\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n /* _FROM_SVG_START_ */\n function getColorStop(el, multiplier) {\n var style = el.getAttribute('style'),\n offset = el.getAttribute('offset') || 0,\n color, colorAlpha, opacity, i;\n\n // convert percents to absolute values\n offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1);\n offset = offset < 0 ? 0 : offset > 1 ? 1 : offset;\n if (style) {\n var keyValuePairs = style.split(/\\s*;\\s*/);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (i = keyValuePairs.length; i--; ) {\n\n var split = keyValuePairs[i].split(/\\s*:\\s*/),\n key = split[0].trim(),\n value = split[1].trim();\n\n if (key === 'stop-color') {\n color = value;\n }\n else if (key === 'stop-opacity') {\n opacity = value;\n }\n }\n }\n\n if (!color) {\n color = el.getAttribute('stop-color') || 'rgb(0,0,0)';\n }\n if (!opacity) {\n opacity = el.getAttribute('stop-opacity');\n }\n\n color = new fabric.Color(color);\n colorAlpha = color.getAlpha();\n opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity);\n opacity *= colorAlpha * multiplier;\n\n return {\n offset: offset,\n color: color.toRgb(),\n opacity: opacity\n };\n }\n\n function getLinearCoords(el) {\n return {\n x1: el.getAttribute('x1') || 0,\n y1: el.getAttribute('y1') || 0,\n x2: el.getAttribute('x2') || '100%',\n y2: el.getAttribute('y2') || 0\n };\n }\n\n function getRadialCoords(el) {\n return {\n x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%',\n y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%',\n r1: 0,\n x2: el.getAttribute('cx') || '50%',\n y2: el.getAttribute('cy') || '50%',\n r2: el.getAttribute('r') || '50%'\n };\n }\n /* _FROM_SVG_END_ */\n\n var clone = fabric.util.object.clone;\n\n /**\n * Gradient class\n * @class fabric.Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n * @see {@link fabric.Gradient#initialize} for constructor definition\n */\n fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ {\n\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n offsetX: 0,\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n offsetY: 0,\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Array[Number]\n * @default null\n */\n gradientTransform: null,\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * @type String pixels || percentage\n * @default 'pixels'\n */\n gradientUnits: 'pixels',\n\n /**\n * Gradient type\n * @type String linear || radial\n * @default 'pixels'\n */\n type: 'linear',\n\n /**\n * Constructor\n * @param {Object} options Options object with type, coords, gradientUnits and colorStops\n * @param {Object} [options.type] gradient type linear or radial\n * @param {Object} [options.gradientUnits] gradient units\n * @param {Object} [options.offsetX] SVG import compatibility\n * @param {Object} [options.offsetY] SVG import compatibility\n * @param {Array[Object]} options.colorStops contains the colorstops.\n * @param {Object} options.coords contains the coords of the gradient\n * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial\n * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial\n * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial\n * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial\n * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle\n * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle\n * @return {fabric.Gradient} thisArg\n */\n initialize: function(options) {\n options || (options = { });\n options.coords || (options.coords = { });\n\n var coords, _this = this;\n\n // sets everything, then coords and colorstops get sets again\n Object.keys(options).forEach(function(option) {\n _this[option] = options[option];\n });\n\n if (this.id) {\n this.id += '_' + fabric.Object.__uid++;\n }\n else {\n this.id = fabric.Object.__uid++;\n }\n\n coords = {\n x1: options.coords.x1 || 0,\n y1: options.coords.y1 || 0,\n x2: options.coords.x2 || 0,\n y2: options.coords.y2 || 0\n };\n\n if (this.type === 'radial') {\n coords.r1 = options.coords.r1 || 0;\n coords.r2 = options.coords.r2 || 0;\n }\n\n this.coords = coords;\n this.colorStops = options.colorStops.slice();\n },\n\n /**\n * Adds another colorStop\n * @param {Object} colorStop Object with offset and color\n * @return {fabric.Gradient} thisArg\n */\n addColorStop: function(colorStops) {\n for (var position in colorStops) {\n var color = new fabric.Color(colorStops[position]);\n this.colorStops.push({\n offset: parseFloat(position),\n color: color.toRgb(),\n opacity: color.getAlpha()\n });\n }\n return this;\n },\n\n /**\n * Returns object representation of a gradient\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object}\n */\n toObject: function(propertiesToInclude) {\n var object = {\n type: this.type,\n coords: this.coords,\n colorStops: this.colorStops,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform\n };\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {Object} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG: function(object, options) {\n var coords = clone(this.coords, true), i, len, options = options || {},\n markup, commonAttributes, colorStops = clone(this.colorStops, true),\n needsSwap = coords.r1 > coords.r2,\n transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(),\n offsetX = -this.offsetX, offsetY = -this.offsetY,\n withViewport = !!options.additionalTransform,\n gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox';\n // colorStops must be sorted ascending\n colorStops.sort(function(a, b) {\n return a.offset - b.offset;\n });\n\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n }\n else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n if (object.type === 'path') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n\n\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n commonAttributes = 'id=\"SVGID_' + this.id +\n '\" gradientUnits=\"' + gradientUnits + '\"';\n commonAttributes += ' gradientTransform=\"' + (withViewport ?\n options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '\" ';\n\n if (this.type === 'linear') {\n markup = [\n '\\n'\n ];\n }\n else if (this.type === 'radial') {\n // svg radial gradient has just 1 radius. the biggest.\n markup = [\n '\\n'\n ];\n }\n\n if (this.type === 'radial') {\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops = colorStops.concat();\n colorStops.reverse();\n for (i = 0, len = colorStops.length; i < len; i++) {\n colorStops[i].offset = 1 - colorStops[i].offset;\n }\n }\n var minRadius = Math.min(coords.r1, coords.r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n var maxRadius = Math.max(coords.r1, coords.r2),\n percentageShift = minRadius / maxRadius;\n for (i = 0, len = colorStops.length; i < len; i++) {\n colorStops[i].offset += percentageShift * (1 - colorStops[i].offset);\n }\n }\n }\n\n for (i = 0, len = colorStops.length; i < len; i++) {\n var colorStop = colorStops[i];\n markup.push(\n '\\n'\n );\n }\n\n markup.push((this.type === 'linear' ? '\\n' : '\\n'));\n\n return markup.join('');\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive: function(ctx) {\n var gradient, coords = fabric.util.object.clone(this.coords), i, len;\n\n if (!this.type) {\n return;\n }\n\n if (this.type === 'linear') {\n gradient = ctx.createLinearGradient(\n coords.x1, coords.y1, coords.x2, coords.y2);\n }\n else if (this.type === 'radial') {\n gradient = ctx.createRadialGradient(\n coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2);\n }\n\n for (i = 0, len = this.colorStops.length; i < len; i++) {\n var color = this.colorStops[i].color,\n opacity = this.colorStops[i].opacity,\n offset = this.colorStops[i].offset;\n\n if (typeof opacity !== 'undefined') {\n color = new fabric.Color(color).setAlpha(opacity).toRgba();\n }\n gradient.addColorStop(offset, color);\n }\n\n return gradient;\n }\n });\n\n fabric.util.object.extend(fabric.Gradient, {\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link fabric.Gradient} instance from an SVG element\n * @static\n * @memberOf fabric.Gradient\n * @param {SVGGradientElement} el SVG gradient element\n * @param {fabric.Object} instance\n * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly graidents\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg\n * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg\n * @param {Object.number} width width part of the svg tag if viewBox is not specified\n * @param {Object.number} height height part of the svg tag if viewBox is not specified\n * @return {fabric.Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n */\n fromElement: function(el, instance, opacityAttr, svgOptions) {\n /**\n * @example:\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n\n var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1);\n multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier;\n if (isNaN(multiplier)) {\n multiplier = 1;\n }\n\n var colorStopEls = el.getElementsByTagName('stop'),\n type,\n gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ?\n 'pixels' : 'percentage',\n gradientTransform = el.getAttribute('gradientTransform') || '',\n colorStops = [],\n coords, i, offsetX = 0, offsetY = 0,\n transformMatrix;\n if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') {\n type = 'linear';\n coords = getLinearCoords(el);\n }\n else {\n type = 'radial';\n coords = getRadialCoords(el);\n }\n\n for (i = colorStopEls.length; i--; ) {\n colorStops.push(getColorStop(colorStopEls[i], multiplier));\n }\n\n transformMatrix = fabric.parseTransformAttribute(gradientTransform);\n\n __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits);\n\n if (gradientUnits === 'pixels') {\n offsetX = -instance.left;\n offsetY = -instance.top;\n }\n\n var gradient = new fabric.Gradient({\n id: el.getAttribute('id'),\n type: type,\n coords: coords,\n colorStops: colorStops,\n gradientUnits: gradientUnits,\n gradientTransform: transformMatrix,\n offsetX: offsetX,\n offsetY: offsetY,\n });\n\n return gradient;\n },\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Gradient} instance from its object representation\n * this function is uniquely used by Object.setGradient and is deprecated with it.\n * @static\n * @deprecated since 3.4.0\n * @memberOf fabric.Gradient\n * @param {Object} obj\n * @param {Object} [options] Options object\n */\n forObject: function(obj, options) {\n options || (options = { });\n __convertPercentUnitsToValues(obj, options.coords, options.gradientUnits, {\n // those values are to avoid errors. this function is uniquely used by\n viewBoxWidth: 100,\n viewBoxHeight: 100,\n });\n return new fabric.Gradient(options);\n }\n });\n\n /**\n * @private\n */\n function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) {\n var propValue, finalValue;\n Object.keys(options).forEach(function(prop) {\n propValue = options[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n }\n else if (propValue === '-Infinity') {\n finalValue = 0;\n }\n else {\n finalValue = parseFloat(options[prop], 10);\n if (typeof propValue === 'string' && /^(\\d+\\.\\d+)%|(\\d+)%$/.test(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= svgOptions.viewBoxWidth || svgOptions.width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= svgOptions.viewBoxHeight || svgOptions.height;\n }\n }\n }\n }\n options[prop] = finalValue;\n });\n }\n})();\n\n\n(function() {\n\n 'use strict';\n\n var toFixed = fabric.util.toFixed;\n\n /**\n * Pattern class\n * @class fabric.Pattern\n * @see {@link http://fabricjs.com/patterns|Pattern demo}\n * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo}\n * @see {@link fabric.Pattern#initialize} for constructor definition\n */\n\n\n fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ {\n\n /**\n * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n * @type String\n * @default\n */\n repeat: 'repeat',\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetX: 0,\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetY: 0,\n\n /**\n * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @type String\n * @default\n */\n crossOrigin: '',\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @type Array\n * @default\n */\n patternTransform: null,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {Function} [callback] function to invoke after callback init.\n * @return {fabric.Pattern} thisArg\n */\n initialize: function(options, callback) {\n options || (options = { });\n\n this.id = fabric.Object.__uid++;\n this.setOptions(options);\n if (!options.source || (options.source && typeof options.source !== 'string')) {\n callback && callback(this);\n return;\n }\n // function string\n if (typeof fabric.util.getFunctionBody(options.source) !== 'undefined') {\n this.source = new Function(fabric.util.getFunctionBody(options.source));\n callback && callback(this);\n }\n else {\n // img src string\n var _this = this;\n this.source = fabric.util.createImage();\n fabric.util.loadImage(options.source, function(img) {\n _this.source = img;\n callback && callback(_this);\n }, null, this.crossOrigin);\n }\n },\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of a pattern instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n source, object;\n\n // callback\n if (typeof this.source === 'function') {\n source = String(this.source);\n }\n // element\n else if (typeof this.source.src === 'string') {\n source = this.source.src;\n }\n // element\n else if (typeof this.source === 'object' && this.source.toDataURL) {\n source = this.source.toDataURL();\n }\n\n object = {\n type: 'pattern',\n source: source,\n repeat: this.repeat,\n crossOrigin: this.crossOrigin,\n offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform ? this.patternTransform.concat() : null\n };\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n * @param {fabric.Object} object\n * @return {String} SVG representation of a pattern\n */\n toSVG: function(object) {\n var patternSource = typeof this.source === 'function' ? this.source() : this.source,\n patternWidth = patternSource.width / object.width,\n patternHeight = patternSource.height / object.height,\n patternOffsetX = this.offsetX / object.width,\n patternOffsetY = this.offsetY / object.height,\n patternImgSrc = '';\n if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') {\n patternHeight = 1;\n if (patternOffsetY) {\n patternHeight += Math.abs(patternOffsetY);\n }\n }\n if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') {\n patternWidth = 1;\n if (patternOffsetX) {\n patternWidth += Math.abs(patternOffsetX);\n }\n\n }\n if (patternSource.src) {\n patternImgSrc = patternSource.src;\n }\n else if (patternSource.toDataURL) {\n patternImgSrc = patternSource.toDataURL();\n }\n\n return '\\n' +\n '\\n' +\n '\\n';\n },\n /* _TO_SVG_END_ */\n\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive: function(ctx) {\n var source = typeof this.source === 'function' ? this.source() : this.source;\n\n // if the image failed to load, return, and allow rest to continue loading\n if (!source) {\n return '';\n }\n\n // if an image\n if (typeof source.src !== 'undefined') {\n if (!source.complete) {\n return '';\n }\n if (source.naturalWidth === 0 || source.naturalHeight === 0) {\n return '';\n }\n }\n return ctx.createPattern(source, this.repeat);\n }\n });\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n toFixed = fabric.util.toFixed;\n\n if (fabric.Shadow) {\n fabric.warn('fabric.Shadow is already defined.');\n return;\n }\n\n /**\n * Shadow class\n * @class fabric.Shadow\n * @see {@link http://fabricjs.com/shadows|Shadow demo}\n * @see {@link fabric.Shadow#initialize} for constructor definition\n */\n fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ {\n\n /**\n * Shadow color\n * @type String\n * @default\n */\n color: 'rgb(0,0,0)',\n\n /**\n * Shadow blur\n * @type Number\n */\n blur: 0,\n\n /**\n * Shadow horizontal offset\n * @type Number\n * @default\n */\n offsetX: 0,\n\n /**\n * Shadow vertical offset\n * @type Number\n * @default\n */\n offsetY: 0,\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n * @default\n */\n affectStroke: false,\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n * @default\n */\n nonScaling: false,\n\n /**\n * Constructor\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n * @return {fabric.Shadow} thisArg\n */\n initialize: function(options) {\n\n if (typeof options === 'string') {\n options = this._parseShadow(options);\n }\n\n for (var prop in options) {\n this[prop] = options[prop];\n }\n\n this.id = fabric.Object.__uid++;\n },\n\n /**\n * @private\n * @param {String} shadow Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n _parseShadow: function(shadow) {\n var shadowStr = shadow.trim(),\n offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [],\n color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)';\n\n return {\n color: color.trim(),\n offsetX: parseInt(offsetsAndBlur[1], 10) || 0,\n offsetY: parseInt(offsetsAndBlur[2], 10) || 0,\n blur: parseInt(offsetsAndBlur[3], 10) || 0\n };\n },\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString: function() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a shadow\n * @param {fabric.Object} object\n * @return {String} SVG representation of a shadow\n */\n toSVG: function(object) {\n var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n offset = fabric.util.rotateVector(\n { x: this.offsetX, y: this.offsetY },\n fabric.util.degreesToRadians(-object.angle)),\n BLUR_BOX = 20, color = new fabric.Color(this.color);\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return (\n '\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\t\\n' +\n '\\t\\t\\n' +\n '\\t\\n' +\n '\\n');\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject: function() {\n if (this.includeDefaultValues) {\n return {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling\n };\n }\n var obj = { }, proto = fabric.Shadow.prototype;\n\n ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) {\n if (this[prop] !== proto[prop]) {\n obj[prop] = this[prop];\n }\n }, this);\n\n return obj;\n }\n });\n\n /**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * @static\n * @field\n * @memberOf fabric.Shadow\n */\n // eslint-disable-next-line max-len\n fabric.Shadow.reOffsetsAndBlur = /(?:\\s|^)(-?\\d+(?:px)?(?:\\s?|$))?(-?\\d+(?:px)?(?:\\s?|$))?(\\d+(?:px)?)?(?:\\s?|$)(?:$|\\s)/;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function () {\n\n 'use strict';\n\n if (fabric.StaticCanvas) {\n fabric.warn('fabric.StaticCanvas is already defined.');\n return;\n }\n\n // aliases for faster resolution\n var extend = fabric.util.object.extend,\n getElementOffset = fabric.util.getElementOffset,\n removeFromArray = fabric.util.removeFromArray,\n toFixed = fabric.util.toFixed,\n transformPoint = fabric.util.transformPoint,\n invertTransform = fabric.util.invertTransform,\n getNodeCanvas = fabric.util.getNodeCanvas,\n createCanvasElement = fabric.util.createCanvasElement,\n\n CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element');\n\n /**\n * Static canvas class\n * @class fabric.StaticCanvas\n * @mixes fabric.Collection\n * @mixes fabric.Observable\n * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n * @see {@link fabric.StaticCanvas#initialize} for constructor definition\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n },\n\n /**\n * Background color of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}.\n * @type {(String|fabric.Pattern)}\n * @default\n */\n backgroundColor: '',\n\n /**\n * Background image of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setBackgroundImage}.\n * Backwards incompatibility note: The \"backgroundImageOpacity\"\n * and \"backgroundImageStretch\" properties are deprecated since 1.3.9.\n * Use {@link fabric.Image#opacity}, {@link fabric.Image#width} and {@link fabric.Image#height}.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type fabric.Image\n * @default\n */\n backgroundImage: null,\n\n /**\n * Overlay color of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setOverlayColor}\n * @since 1.3.9\n * @type {(String|fabric.Pattern)}\n * @default\n */\n overlayColor: '',\n\n /**\n * Overlay image of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setOverlayImage}.\n * Backwards incompatibility note: The \"overlayImageLeft\"\n * and \"overlayImageTop\" properties are deprecated since 1.3.9.\n * Use {@link fabric.Image#left} and {@link fabric.Image#top}.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type fabric.Image\n * @default\n */\n overlayImage: null,\n\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * Indicates whether objects' state should be saved\n * @type Boolean\n * @default\n */\n stateful: false,\n\n /**\n * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove},\n * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are quequed and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n * @default\n */\n renderOnAddRemove: true,\n\n /**\n * Function that determines clipping of entire canvas area\n * Being passed context as first argument.\n * If you are using code minification, ctx argument can be minified/manglied you should use\n * as a workaround `var ctx = arguments[0];` in the function;\n * See clipping canvas area in {@link https://github.com/kangax/fabric.js/wiki/FAQ}\n * @deprecated since 2.0.0\n * @type Function\n * @default\n */\n clipTo: null,\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n * @default\n */\n controlsAboveOverlay: false,\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * @type Boolean\n * @default\n */\n allowTouchScrolling: false,\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n * @default\n */\n imageSmoothingEnabled: true,\n\n /**\n * The transformation (in the format of Canvas transform) which focuses the viewport\n * @type Array\n * @default\n */\n viewportTransform: fabric.iMatrix.concat(),\n\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n backgroundVpt: true,\n\n /**\n * if set to false overlya image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n overlayVpt: true,\n\n /**\n * Callback; invoked right before object is about to be scaled/rotated\n * @deprecated since 2.3.0\n * Use before:transform event\n */\n onBeforeScaleRotate: function () {\n /* NOOP */\n },\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n * @default\n */\n enableRetinaScaling: true,\n\n /**\n * Describe canvas element extension over design\n * properties are tl,tr,bl,br.\n * if canvas is not zoomed/panned those points are the four corner of canvas\n * if canvas is viewportTransformed you those points indicate the extension\n * of canvas element in plain untrasformed coordinates\n * The coordinates get updated with @method calcViewportBoundaries.\n * @memberOf fabric.StaticCanvas.prototype\n */\n vptCoords: { },\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @memberOf fabric.StaticCanvas.prototype\n * @type Boolean\n * @default\n */\n skipOffscreen: true,\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * @private\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n */\n _initStatic: function(el, options) {\n var cb = this.requestRenderAllBound;\n this._objects = [];\n this._createLowerCanvas(el);\n this._initOptions(options);\n this._setImageSmoothing();\n // only initialize retina scaling once\n if (!this.interactive) {\n this._initRetinaScaling();\n }\n\n if (options.overlayImage) {\n this.setOverlayImage(options.overlayImage, cb);\n }\n if (options.backgroundImage) {\n this.setBackgroundImage(options.backgroundImage, cb);\n }\n if (options.backgroundColor) {\n this.setBackgroundColor(options.backgroundColor, cb);\n }\n if (options.overlayColor) {\n this.setOverlayColor(options.overlayColor, cb);\n }\n this.calcOffset();\n },\n\n /**\n * @private\n */\n _isRetinaScaling: function() {\n return (fabric.devicePixelRatio !== 1 && this.enableRetinaScaling);\n },\n\n /**\n * @private\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling: function() {\n return this._isRetinaScaling() ? fabric.devicePixelRatio : 1;\n },\n\n /**\n * @private\n */\n _initRetinaScaling: function() {\n if (!this._isRetinaScaling()) {\n return;\n }\n this.lowerCanvasEl.setAttribute('width', this.width * fabric.devicePixelRatio);\n this.lowerCanvasEl.setAttribute('height', this.height * fabric.devicePixelRatio);\n\n this.contextContainer.scale(fabric.devicePixelRatio, fabric.devicePixelRatio);\n },\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n * @return {fabric.Canvas} instance\n * @chainable\n */\n calcOffset: function () {\n this._offset = getElementOffset(this.lowerCanvasEl);\n return this;\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas\n * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to\n * @param {Function} callback callback to invoke when image is loaded and set as an overlay\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}.\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo}\n * @example Normal overlayImage with left/top = 0\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * // Needed to position overlayImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example overlayImage with different properties\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top'\n * });\n * @example Stretched overlayImage #1 - width/height correspond to canvas width/height\n * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img) {\n * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n * canvas.setOverlayImage(img, canvas.renderAll.bind(canvas));\n * });\n * @example Stretched overlayImage #2 - width/height correspond to canvas width/height\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * width: canvas.width,\n * height: canvas.height,\n * // Needed to position overlayImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example overlayImage loaded from cross-origin\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top',\n * crossOrigin: 'anonymous'\n * });\n */\n setOverlayImage: function (image, callback, options) {\n return this.__setBgOverlayImage('overlayImage', image, callback, options);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas\n * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to\n * @param {Function} callback Callback to invoke when image is loaded and set as background\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}.\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo}\n * @example Normal backgroundImage with left/top = 0\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * // Needed to position backgroundImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example backgroundImage with different properties\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top'\n * });\n * @example Stretched backgroundImage #1 - width/height correspond to canvas width/height\n * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img) {\n * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n * canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));\n * });\n * @example Stretched backgroundImage #2 - width/height correspond to canvas width/height\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * width: canvas.width,\n * height: canvas.height,\n * // Needed to position backgroundImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example backgroundImage loaded from cross-origin\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top',\n * crossOrigin: 'anonymous'\n * });\n */\n // TODO: fix stretched examples\n setBackgroundImage: function (image, callback, options) {\n return this.__setBgOverlayImage('backgroundImage', image, callback, options);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas\n * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to\n * @param {Function} callback Callback to invoke when foreground color is set\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo}\n * @example Normal overlayColor - color value\n * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as overlayColor\n * canvas.setOverlayColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png'\n * }, canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as overlayColor with repeat and offset\n * canvas.setOverlayColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat',\n * offsetX: 200,\n * offsetY: 100\n * }, canvas.renderAll.bind(canvas));\n */\n setOverlayColor: function(overlayColor, callback) {\n return this.__setBgOverlayColor('overlayColor', overlayColor, callback);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas\n * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to\n * @param {Function} callback Callback to invoke when background color is set\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo}\n * @example Normal backgroundColor - color value\n * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as backgroundColor\n * canvas.setBackgroundColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png'\n * }, canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as backgroundColor with repeat and offset\n * canvas.setBackgroundColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat',\n * offsetX: 200,\n * offsetY: 100\n * }, canvas.renderAll.bind(canvas));\n */\n setBackgroundColor: function(backgroundColor, callback) {\n return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback);\n },\n\n /**\n * @private\n * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-imagesmoothingenabled|WhatWG Canvas Standard}\n */\n _setImageSmoothing: function() {\n var ctx = this.getContext();\n\n ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled\n || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled;\n ctx.imageSmoothingEnabled = this.imageSmoothingEnabled;\n },\n\n /**\n * @private\n * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage}\n * or {@link fabric.StaticCanvas#overlayImage|overlayImage})\n * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to\n * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}.\n */\n __setBgOverlayImage: function(property, image, callback, options) {\n if (typeof image === 'string') {\n fabric.util.loadImage(image, function(img) {\n if (img) {\n var instance = new fabric.Image(img, options);\n this[property] = instance;\n instance.canvas = this;\n }\n callback && callback(img);\n }, this, options && options.crossOrigin);\n }\n else {\n options && image.setOptions(options);\n this[property] = image;\n image && (image.canvas = this);\n callback && callback(image);\n }\n\n return this;\n },\n\n /**\n * @private\n * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor}\n * or {@link fabric.StaticCanvas#overlayColor|overlayColor})\n * @param {(Object|String|null)} color Object with pattern information, color value or null\n * @param {Function} [callback] Callback is invoked when color is set\n */\n __setBgOverlayColor: function(property, color, callback) {\n this[property] = color;\n this._initGradient(color, property);\n this._initPattern(color, property, callback);\n return this;\n },\n\n /**\n * @private\n */\n _createCanvasElement: function() {\n var element = createCanvasElement();\n if (!element) {\n throw CANVAS_INIT_ERROR;\n }\n if (!element.style) {\n element.style = { };\n }\n if (typeof element.getContext === 'undefined') {\n throw CANVAS_INIT_ERROR;\n }\n return element;\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initOptions: function (options) {\n var lowerCanvasEl = this.lowerCanvasEl;\n this._setOptions(options);\n\n this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0;\n this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0;\n\n if (!this.lowerCanvasEl.style) {\n return;\n }\n\n lowerCanvasEl.width = this.width;\n lowerCanvasEl.height = this.height;\n\n lowerCanvasEl.style.width = this.width + 'px';\n lowerCanvasEl.style.height = this.height + 'px';\n\n this.viewportTransform = this.viewportTransform.slice();\n },\n\n /**\n * Creates a bottom canvas\n * @private\n * @param {HTMLElement} [canvasEl]\n */\n _createLowerCanvas: function (canvasEl) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n if (canvasEl && canvasEl.getContext) {\n this.lowerCanvasEl = canvasEl;\n }\n else {\n this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement();\n }\n\n fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas');\n\n if (this.interactive) {\n this._applyCanvasStyle(this.lowerCanvasEl);\n }\n\n this.contextContainer = this.lowerCanvasEl.getContext('2d');\n },\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth: function () {\n return this.width;\n },\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight: function () {\n return this.height;\n },\n\n /**\n * Sets width of this canvas instance\n * @param {Number|String} value Value to set width to\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setWidth: function (value, options) {\n return this.setDimensions({ width: value }, options);\n },\n\n /**\n * Sets height of this canvas instance\n * @param {Number|String} value Value to set height to\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setHeight: function (value, options) {\n return this.setDimensions({ height: value }, options);\n },\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setDimensions: function (dimensions, options) {\n var cssValue;\n\n options = options || {};\n\n for (var prop in dimensions) {\n cssValue = dimensions[prop];\n\n if (!options.cssOnly) {\n this._setBackstoreDimension(prop, dimensions[prop]);\n cssValue += 'px';\n this.hasLostContext = true;\n }\n\n if (!options.backstoreOnly) {\n this._setCssDimension(prop, cssValue);\n }\n }\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles();\n }\n this._initRetinaScaling();\n this._setImageSmoothing();\n this.calcOffset();\n\n if (!options.cssOnly) {\n this.requestRenderAll();\n }\n\n return this;\n },\n\n /**\n * Helper for setting width/height\n * @private\n * @param {String} prop property (width|height)\n * @param {Number} value value to set property to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n _setBackstoreDimension: function (prop, value) {\n this.lowerCanvasEl[prop] = value;\n\n if (this.upperCanvasEl) {\n this.upperCanvasEl[prop] = value;\n }\n\n if (this.cacheCanvasEl) {\n this.cacheCanvasEl[prop] = value;\n }\n\n this[prop] = value;\n\n return this;\n },\n\n /**\n * Helper for setting css width/height\n * @private\n * @param {String} prop property (width|height)\n * @param {String} value value to set property to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n _setCssDimension: function (prop, value) {\n this.lowerCanvasEl.style[prop] = value;\n\n if (this.upperCanvasEl) {\n this.upperCanvasEl.style[prop] = value;\n }\n\n if (this.wrapperEl) {\n this.wrapperEl.style[prop] = value;\n }\n\n return this;\n },\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom: function () {\n return this.viewportTransform[0];\n },\n\n /**\n * Sets viewport transform of this canvas instance\n * @param {Array} vpt the transform in the form of context.transform\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setViewportTransform: function (vpt) {\n var activeObject = this._activeObject, object, ignoreVpt = false, skipAbsolute = true, i, len;\n this.viewportTransform = vpt;\n for (i = 0, len = this._objects.length; i < len; i++) {\n object = this._objects[i];\n object.group || object.setCoords(ignoreVpt, skipAbsolute);\n }\n if (activeObject && activeObject.type === 'activeSelection') {\n activeObject.setCoords(ignoreVpt, skipAbsolute);\n }\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Sets zoom level of this canvas instance, zoom centered around point\n * @param {fabric.Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n zoomToPoint: function (point, value) {\n // TODO: just change the scale, preserve other transformations\n var before = point, vpt = this.viewportTransform.slice(0);\n point = transformPoint(point, invertTransform(this.viewportTransform));\n vpt[0] = value;\n vpt[3] = value;\n var after = transformPoint(point, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n return this.setViewportTransform(vpt);\n },\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setZoom: function (value) {\n this.zoomToPoint(new fabric.Point(0, 0), value);\n return this;\n },\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {fabric.Point} point to move to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n absolutePan: function (point) {\n var vpt = this.viewportTransform.slice(0);\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n },\n\n /**\n * Pans viewpoint relatively\n * @param {fabric.Point} point (position vector) to move by\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n relativePan: function (point) {\n return this.absolutePan(new fabric.Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5]\n ));\n },\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement: function () {\n return this.lowerCanvasEl;\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was added\n */\n _onObjectAdded: function(obj) {\n this.stateful && obj.setupState();\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added');\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n this.fire('object:removed', { target: obj });\n obj.fire('removed');\n delete obj.canvas;\n },\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clearContext: function(ctx) {\n ctx.clearRect(0, 0, this.width, this.height);\n return this;\n },\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext: function () {\n return this.contextContainer;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n this._objects.length = 0;\n this.backgroundImage = null;\n this.overlayImage = null;\n this.backgroundColor = '';\n this.overlayColor = '';\n if (this._hasITextHandlers) {\n this.off('mouse:up', this._mouseUpITextHandler);\n this._iTextInstances = null;\n this._hasITextHandlers = false;\n }\n this.clearContext(this.contextContainer);\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Renders the canvas\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._objects);\n return this;\n },\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAndReset: function() {\n this.isRendering = 0;\n this.renderAll();\n },\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n requestRenderAll: function () {\n if (!this.isRendering) {\n this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound);\n }\n return this;\n },\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport using\n * object absolute coordinates ( aCoords )\n * @return {Object} points.tl\n * @chainable\n */\n calcViewportBoundaries: function() {\n var points = { }, width = this.width, height = this.height,\n iVpt = invertTransform(this.viewportTransform);\n points.tl = transformPoint({ x: 0, y: 0 }, iVpt);\n points.br = transformPoint({ x: width, y: height }, iVpt);\n points.tr = new fabric.Point(points.br.x, points.tl.y);\n points.bl = new fabric.Point(points.tl.x, points.br.y);\n this.vptCoords = points;\n return points;\n },\n\n cancelRequestedRender: function() {\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n },\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderCanvas: function(ctx, objects) {\n var v = this.viewportTransform, path = this.clipPath;\n this.cancelRequestedRender();\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n this.fire('before:render', { ctx: ctx, });\n if (this.clipTo) {\n fabric.util.clipContext(this, ctx);\n }\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && this.interactive) {\n this.drawControls(ctx);\n }\n if (this.clipTo) {\n ctx.restore();\n }\n if (path) {\n path.canvas = this;\n // needed to setup a couple of variables\n path.shouldCache();\n path._transformDone = true;\n path.renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && this.interactive) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx: ctx, });\n },\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas: function(ctx) {\n var v = this.viewportTransform, path = this.clipPath;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n path.transform(ctx);\n ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects: function(ctx, objects) {\n var i, len;\n for (i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay: function(ctx, property) {\n var fill = this[property + 'Color'], object = this[property + 'Image'],\n v = this.viewportTransform, needsVpt = this[property + 'Vpt'];\n if (!fill && !object) {\n return;\n }\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = fill.toLive\n ? fill.toLive(ctx, this)\n : fill;\n if (needsVpt) {\n ctx.transform(\n v[0], v[1], v[2], v[3],\n v[4] + (fill.offsetX || 0),\n v[5] + (fill.offsetY || 0)\n );\n }\n var m = fill.gradientTransform || fill.patternTransform;\n m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n if (needsVpt) {\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n object.render(ctx);\n ctx.restore();\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay: function(ctx) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n },\n\n /**\n * Returns coordinates of a center of canvas.\n * Returned value is an object with top and left properties\n * @return {Object} object with \"top\" and \"left\" number values\n */\n getCenter: function () {\n return {\n top: this.height / 2,\n left: this.width / 2\n };\n },\n\n /**\n * Centers object horizontally in the canvas\n * @param {fabric.Object} object Object to center horizontally\n * @return {fabric.Canvas} thisArg\n */\n centerObjectH: function (object) {\n return this._centerObject(object, new fabric.Point(this.getCenter().left, object.getCenterPoint().y));\n },\n\n /**\n * Centers object vertically in the canvas\n * @param {fabric.Object} object Object to center vertically\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n centerObjectV: function (object) {\n return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenter().top));\n },\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n centerObject: function(object) {\n var center = this.getCenter();\n\n return this._centerObject(object, new fabric.Point(center.left, center.top));\n },\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObject: function(object) {\n var vpCenter = this.getVpCenter();\n\n return this._centerObject(object, vpCenter);\n },\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObjectH: function(object) {\n var vpCenter = this.getVpCenter();\n this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y));\n return this;\n },\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObjectV: function(object) {\n var vpCenter = this.getVpCenter();\n\n return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y));\n },\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {fabric.Point} vpCenter, viewport center\n * @chainable\n */\n getVpCenter: function() {\n var center = this.getCenter(),\n iVpt = invertTransform(this.viewportTransform);\n return transformPoint({ x: center.left, y: center.top }, iVpt);\n },\n\n /**\n * @private\n * @param {fabric.Object} object Object to center\n * @param {fabric.Point} center Center point\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n _centerObject: function(object, center) {\n object.setPositionByOrigin(center, 'center', 'center');\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Returs dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON: function (propertiesToInclude) {\n return this.toDatalessObject(propertiesToInclude);\n },\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function (propertiesToInclude) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n },\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function (propertiesToInclude) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n },\n\n /**\n * @private\n */\n _toObjectMethod: function (methodName, propertiesToInclude) {\n\n var clipPath = this.clipPath, data = {\n version: fabric.version,\n objects: this._toObjects(methodName, propertiesToInclude),\n };\n if (clipPath) {\n data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude);\n }\n extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude));\n\n fabric.util.populateWithProperties(this, data, propertiesToInclude);\n\n return data;\n },\n\n /**\n * @private\n */\n _toObjects: function(methodName, propertiesToInclude) {\n return this._objects.filter(function(object) {\n return !object.excludeFromExport;\n }).map(function(instance) {\n return this._toObject(instance, methodName, propertiesToInclude);\n }, this);\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n var originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n var object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = originalValue;\n }\n return object;\n },\n\n /**\n * @private\n */\n __serializeBgOverlay: function(methodName, propertiesToInclude) {\n var data = { }, bgImage = this.backgroundImage, overlay = this.overlayImage;\n\n if (this.backgroundColor) {\n data.background = this.backgroundColor.toObject\n ? this.backgroundColor.toObject(propertiesToInclude)\n : this.backgroundColor;\n }\n\n if (this.overlayColor) {\n data.overlay = this.overlayColor.toObject\n ? this.overlayColor.toObject(propertiesToInclude)\n : this.overlayColor;\n }\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude);\n }\n if (overlay && !overlay.excludeFromExport) {\n data.overlayImage = this._toObject(overlay, methodName, propertiesToInclude);\n }\n\n return data;\n },\n\n /* _TO_SVG_START_ */\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n * @default\n */\n svgViewportTransformation: true,\n\n /**\n * Returns SVG representation of canvas\n * @function\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-cooridnate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG: function(options, reviver) {\n options || (options = { });\n options.reviver = reviver;\n var markup = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n },\n\n /**\n * @private\n */\n _setSVGPreamble: function(markup, options) {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n'\n );\n },\n\n /**\n * @private\n */\n _setSVGHeader: function(markup, options) {\n var width = options.width || this.width,\n height = options.height || this.height,\n vpt, viewBox = 'viewBox=\"0 0 ' + this.width + ' ' + this.height + '\" ',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n if (options.viewBox) {\n viewBox = 'viewBox=\"' +\n options.viewBox.x + ' ' +\n options.viewBox.y + ' ' +\n options.viewBox.width + ' ' +\n options.viewBox.height + '\" ';\n }\n else {\n if (this.svgViewportTransformation) {\n vpt = this.viewportTransform;\n viewBox = 'viewBox=\"' +\n toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '\" ';\n }\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ', fabric.version, '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n'\n );\n },\n\n createSVGClipPathMarkup: function(options) {\n var clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n return '\\n' +\n this.clipPath.toClipPathSVG(options.reviver) +\n '\\n';\n }\n return '';\n },\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup: function() {\n var _this = this,\n markup = ['background', 'overlay'].map(function(prop) {\n var fill = _this[prop + 'Color'];\n if (fill && fill.toLive) {\n var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform,\n object = {\n width: _this.width / (shouldTransform ? vpt[0] : 1),\n height: _this.height / (shouldTransform ? vpt[3] : 1)\n };\n return fill.toSVG(\n object,\n { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' }\n );\n }\n });\n return markup.join('');\n },\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup: function() {\n var markup = '', fontList = { }, obj, fontFamily,\n style, row, rowIndex, _char, charIndex, i, len,\n fontPaths = fabric.fontPaths, objects = this._objects;\n\n for (i = 0, len = objects.length; i < len; i++) {\n obj = objects[i];\n fontFamily = obj.fontFamily;\n if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) {\n continue;\n }\n fontList[fontFamily] = true;\n if (!obj.styles) {\n continue;\n }\n style = obj.styles;\n for (rowIndex in style) {\n row = style[rowIndex];\n for (charIndex in row) {\n _char = row[charIndex];\n fontFamily = _char.fontFamily;\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n }\n }\n }\n\n for (var j in fontList) {\n markup += [\n '\\t\\t@font-face {\\n',\n '\\t\\t\\tfont-family: \\'', j, '\\';\\n',\n '\\t\\t\\tsrc: url(\\'', fontPaths[j], '\\');\\n',\n '\\t\\t}\\n'\n ].join('');\n }\n\n if (markup) {\n markup = [\n '\\t\\n'\n ].join('');\n }\n\n return markup;\n },\n\n /**\n * @private\n */\n _setSVGObjects: function(markup, reviver) {\n var instance, i, len, objects = this._objects;\n for (i = 0, len = objects.length; i < len; i++) {\n instance = objects[i];\n if (instance.excludeFromExport) {\n continue;\n }\n this._setSVGObject(markup, instance, reviver);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n markup.push(instance.toSVG(reviver));\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayImage: function(markup, property, reviver) {\n if (this[property] && !this[property].excludeFromExport && this[property].toSVG) {\n markup.push(this[property].toSVG(reviver));\n }\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayColor: function(markup, property) {\n var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width,\n finalHeight = this.height;\n if (!filler) {\n return;\n }\n if (filler.toLive) {\n var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'],\n additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : '';\n markup.push(\n '\\n'\n );\n }\n else {\n markup.push(\n '\\n'\n );\n }\n },\n /* _TO_SVG_END_ */\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendToBack: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.unshift(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringToFront: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.push(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.push(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional paramter, intersecting allowes to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendBackwards: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx > 0 + objsMoved) {\n newIdx = idx - 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n newIdx = this._findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewLowerIndex: function(object, idx, intersecting) {\n var newIdx, i;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse down the stack looking for the nearest intersecting object\n for (i = idx - 1; i >= 0; --i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional paramter, intersecting allowes to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringForward: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx < this._objects.length - 1 - objsMoved) {\n newIdx = idx + 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n newIdx = this._findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewUpperIndex: function(object, idx, intersecting) {\n var newIdx, i, len;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse up the stack looking for the nearest intersecting object\n for (i = idx + 1, len = this._objects.length; i < len; ++i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {Number} index Position to move to\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n moveTo: function (object, index) {\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n return this.renderOnAddRemove && this.requestRenderAll();\n },\n\n /**\n * Clears a canvas element and dispose objects\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n // cancel eventually ongoing renders\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n this.forEachObject(function(object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n if (this.backgroundImage && this.backgroundImage.dispose) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = null;\n if (this.overlayImage && this.overlayImage.dispose) {\n this.overlayImage.dispose();\n }\n this.overlayImage = null;\n this._iTextInstances = null;\n this.contextContainer = null;\n fabric.util.cleanUpJsdomNode(this.lowerCanvasEl);\n this.lowerCanvasEl = undefined;\n return this;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function () {\n return '#';\n }\n });\n\n extend(fabric.StaticCanvas.prototype, fabric.Observable);\n extend(fabric.StaticCanvas.prototype, fabric.Collection);\n extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter);\n\n extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ {\n\n /**\n * @static\n * @type String\n * @default\n */\n EMPTY_JSON: '{\"objects\": [], \"background\": \"white\"}',\n\n /**\n * Provides a way to check support of some of the canvas methods\n * (either those of HTMLCanvasElement itself, or rendering context)\n *\n * @param {String} methodName Method to check support for;\n * Could be one of \"setLineDash\"\n * @return {Boolean | null} `true` if method is supported (or at least exists),\n * `null` if canvas element or context can not be initialized\n */\n supports: function (methodName) {\n var el = createCanvasElement();\n\n if (!el || !el.getContext) {\n return null;\n }\n\n var ctx = el.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n switch (methodName) {\n\n case 'setLineDash':\n return typeof ctx.setLineDash !== 'undefined';\n\n default:\n return null;\n }\n }\n });\n\n /**\n * Returns JSON representation of canvas\n * @function\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} JSON string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON without additional properties\n * var json = canvas.toJSON();\n * @example JSON with additional properties included\n * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY', 'lockUniScaling']);\n * @example JSON without default values\n * canvas.includeDefaultValues = false;\n * var json = canvas.toJSON();\n */\n fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;\n\n if (fabric.isLikelyNode) {\n fabric.StaticCanvas.prototype.createPNGStream = function() {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createPNGStream();\n };\n fabric.StaticCanvas.prototype.createJPEGStream = function(opts) {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createJPEGStream(opts);\n };\n }\n})();\n\n\n/**\n * BaseBrush class\n * @class fabric.BaseBrush\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nfabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ {\n\n /**\n * Color of a brush\n * @type String\n * @default\n */\n color: 'rgb(0, 0, 0)',\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n * @default\n */\n width: 1,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'round',\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'round',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n * @default\n */\n strokeMiterLimit: 10,\n\n /**\n * Stroke Dash Array.\n * @type Array\n * @default\n */\n strokeDashArray: null,\n\n /**\n * Sets shadow of an object\n * @param {Object|String} [options] Options object or string (e.g. \"2px 2px 10px rgba(0,0,0,0.2)\")\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setShadow: function(options) {\n this.shadow = new fabric.Shadow(options);\n return this;\n },\n\n /**\n * Sets brush styles\n * @private\n */\n _setBrushStyles: function() {\n var ctx = this.canvas.contextTop;\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n if (fabric.StaticCanvas.supports('setLineDash')) {\n ctx.setLineDash(this.strokeDashArray || []);\n }\n },\n\n /**\n * Sets the transformation on given context\n * @param {RenderingContext2d} ctx context to render on\n * @private\n */\n _saveAndTransform: function(ctx) {\n var v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n },\n\n /**\n * Sets brush shadow styles\n * @private\n */\n _setShadow: function() {\n if (!this.shadow) {\n return;\n }\n\n var ctx = this.canvas.contextTop,\n zoom = this.canvas.getZoom();\n\n ctx.shadowColor = this.shadow.color;\n ctx.shadowBlur = this.shadow.blur * zoom;\n ctx.shadowOffsetX = this.shadow.offsetX * zoom;\n ctx.shadowOffsetY = this.shadow.offsetY * zoom;\n },\n\n needsFullRender: function() {\n var color = new fabric.Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n },\n\n /**\n * Removes brush shadow styles\n * @private\n */\n _resetShadow: function() {\n var ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n }\n});\n\n\n(function() {\n /**\n * PencilBrush class\n * @class fabric.PencilBrush\n * @extends fabric.BaseBrush\n */\n fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ {\n\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate: 0.4,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.PencilBrush} Instance of a pencil brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this._points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n _drawSegment: function (ctx, p1, p2) {\n var midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n },\n\n /**\n * Inovoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._captureDrawingPath(pointer);\n this._render();\n },\n\n /**\n * Inovoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n if (this._captureDrawingPath(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n }\n else {\n var points = this._points, length = points.length, ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true);\n ctx.stroke();\n ctx.restore();\n }\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function(options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return true;\n }\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n return false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing: function(pointer) {\n\n var p = new fabric.Point(pointer.x, pointer.y);\n\n this._reset();\n this._addPoint(p);\n this.canvas.contextTop.moveTo(p.x, p.y);\n },\n\n /**\n * @private\n * @param {fabric.Point} point Point to be added to points array\n */\n _addPoint: function(point) {\n if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) {\n return false;\n }\n this._points.push(point);\n return true;\n },\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset: function() {\n this._points = [];\n this._setBrushStyles();\n this._setShadow();\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _captureDrawingPath: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y);\n return this._addPoint(pointerPoint);\n },\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n p1 = this._points[0],\n p2 = this._points[1];\n\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n var width = this.width / 1000;\n p1 = new fabric.Point(p1.x, p1.y);\n p2 = new fabric.Point(p2.x, p2.y);\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (i = 1, len = this._points.length; i < len; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n this._drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * Converts points to SVG path\n * @param {Array} points Array of points\n * @return {String} SVG path\n */\n convertPointsToSVGPath: function(points) {\n var path = [], i, width = this.width / 1000,\n p1 = new fabric.Point(points[0].x, points[0].y),\n p2 = new fabric.Point(points[1].x, points[1].y),\n len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push('M ', p1.x - multSignX * width, ' ', p1.y - multSignY * width, ' ');\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n var midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push('Q ', p1.x, ' ', p1.y, ' ', midPoint.x, ' ', midPoint.y, ' ');\n }\n p1 = points[i];\n if ((i + 1) < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push('L ', p1.x + multSignX * width, ' ', p1.y + multSignY * width);\n return path;\n },\n\n /**\n * Creates fabric.Path object to add on canvas\n * @param {String} pathData Path data\n * @return {fabric.Path} Path to add on canvas\n */\n createPath: function(pathData) {\n var path = new fabric.Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.setShadow(this.shadow);\n }\n\n return path;\n },\n\n /**\n * Decimate poins array with the decimate value\n */\n decimatePoints: function(points, distance) {\n if (points.length <= 2) {\n return points;\n }\n var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2),\n i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint],\n cDistance;\n for (i = 1; i < l; i++) {\n cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n if (newPoints.length === 1) {\n newPoints.push(new fabric.Point(newPoints[0].x, newPoints[0].y));\n }\n return newPoints;\n },\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new fabric path object\n * and add it to the fabric canvas.\n */\n _finalizeAndAddPath: function() {\n var ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n var pathData = this.convertPointsToSVGPath(this._points).join('');\n if (pathData === 'M 0 0 Q 0 0 0 0 L 0 0') {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n var path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.add(path);\n this.canvas.renderAll();\n path.setCoords();\n this._resetShadow();\n\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n });\n})();\n\n\n/**\n * CircleBrush class\n * @class fabric.CircleBrush\n */\nfabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ {\n\n /**\n * Width of a brush\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.CircleBrush} Instance of a circle brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n drawDot: function(pointer) {\n var point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n },\n\n dot: function(ctx, point) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n },\n\n /**\n * Invoked on mouse down\n */\n onMouseDown: function(pointer) {\n this.points.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n },\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n points = this.points;\n this._saveAndTransform(ctx);\n for (i = 0, len = points.length; i < len; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n }\n else {\n this.drawDot(pointer);\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len;\n this.canvas.renderOnAddRemove = false;\n\n var circles = [];\n\n for (i = 0, len = this.points.length; i < len; i++) {\n var point = this.points[i],\n circle = new fabric.Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: 'center',\n originY: 'center',\n fill: point.fill\n });\n\n this.shadow && circle.setShadow(this.shadow);\n\n circles.push(circle);\n }\n var group = new fabric.Group(circles);\n group.canvas = this.canvas;\n\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @param {Object} pointer\n * @return {fabric.Point} Just added pointer point\n */\n addPoint: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y),\n\n circleRadius = fabric.util.getRandomInt(\n Math.max(0, this.width - 20), this.width + 20) / 2,\n\n circleColor = new fabric.Color(this.color)\n .setAlpha(fabric.util.getRandomInt(0, 100) / 100)\n .toRgba();\n\n pointerPoint.radius = circleRadius;\n pointerPoint.fill = circleColor;\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n});\n\n\n/**\n * SprayBrush class\n * @class fabric.SprayBrush\n */\nfabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ {\n\n /**\n * Width of a spray\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n * @default\n */\n density: 20,\n\n /**\n * Width of spray dots\n * @type Number\n * @default\n */\n dotWidth: 1,\n\n /**\n * Width variance of spray dots\n * @type Number\n * @default\n */\n dotWidthVariance: 1,\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n * @default\n */\n randomOpacity: false,\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n * @default\n */\n optimizeOverlapping: true,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.SprayBrush} Instance of a spray brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.sprayChunks = [];\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer) {\n this.sprayChunks.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n var rects = [];\n\n for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n var sprayChunk = this.sprayChunks[i];\n\n for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) {\n\n var rect = new fabric.Rect({\n width: sprayChunk[j].width,\n height: sprayChunk[j].width,\n left: sprayChunk[j].x + 1,\n top: sprayChunk[j].y + 1,\n originX: 'center',\n originY: 'center',\n fill: this.color\n });\n rects.push(rect);\n }\n }\n\n if (this.optimizeOverlapping) {\n rects = this._getOptimizedRects(rects);\n }\n\n var group = new fabric.Group(rects);\n this.shadow && group.setShadow(this.shadow);\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @private\n * @param {Array} rects\n */\n _getOptimizedRects: function(rects) {\n\n // avoid creating duplicate rects at the same coordinates\n var uniqueRects = { }, key, i, len;\n\n for (i = 0, len = rects.length; i < len; i++) {\n key = rects[i].left + '' + rects[i].top;\n if (!uniqueRects[key]) {\n uniqueRects[key] = rects[i];\n }\n }\n var uniqueRectsArray = [];\n for (key in uniqueRects) {\n uniqueRectsArray.push(uniqueRects[key]);\n }\n\n return uniqueRectsArray;\n },\n\n /**\n * Render new chunk of spray brush\n */\n render: function(sprayChunk) {\n var ctx = this.canvas.contextTop, i, len;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, len = sprayChunk.length; i < len; i++) {\n var point = sprayChunk[i];\n if (typeof point.opacity !== 'undefined') {\n ctx.globalAlpha = point.opacity;\n }\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n ctx.restore();\n },\n\n /**\n * Render all spray chunks\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, ilen;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n this.render(this.sprayChunks[i]);\n }\n ctx.restore();\n },\n\n /**\n * @param {Object} pointer\n */\n addSprayChunk: function(pointer) {\n this.sprayChunkPoints = [];\n\n var x, y, width, radius = this.width / 2, i;\n\n for (i = 0; i < this.density; i++) {\n\n x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius);\n y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius);\n\n if (this.dotWidthVariance) {\n width = fabric.util.getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance);\n }\n else {\n width = this.dotWidth;\n }\n\n var point = new fabric.Point(x, y);\n point.width = width;\n\n if (this.randomOpacity) {\n point.opacity = fabric.util.getRandomInt(0, 100) / 100;\n }\n\n this.sprayChunkPoints.push(point);\n }\n\n this.sprayChunks.push(this.sprayChunkPoints);\n }\n});\n\n\n/**\n * PatternBrush class\n * @class fabric.PatternBrush\n * @extends fabric.BaseBrush\n */\nfabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ {\n\n getPatternSrc: function() {\n\n var dotWidth = 20,\n dotDistance = 5,\n patternCanvas = fabric.util.createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false);\n patternCtx.closePath();\n patternCtx.fill();\n\n return patternCanvas;\n },\n\n getPatternSrcFunction: function() {\n return String(this.getPatternSrc).replace('this.color', '\"' + this.color + '\"');\n },\n\n /**\n * Creates \"pattern\" instance property\n */\n getPattern: function() {\n return this.canvas.contextTop.createPattern(this.source || this.getPatternSrc(), 'repeat');\n },\n\n /**\n * Sets brush styles\n */\n _setBrushStyles: function() {\n this.callSuper('_setBrushStyles');\n this.canvas.contextTop.strokeStyle = this.getPattern();\n },\n\n /**\n * Creates path\n */\n createPath: function(pathData) {\n var path = this.callSuper('createPath', pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new fabric.Pattern({\n source: this.source || this.getPatternSrcFunction(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y\n });\n return path;\n }\n});\n\n\n(function() {\n\n var getPointer = fabric.util.getPointer,\n degreesToRadians = fabric.util.degreesToRadians,\n radiansToDegrees = fabric.util.radiansToDegrees,\n atan2 = Math.atan2,\n abs = Math.abs,\n supportLineDash = fabric.StaticCanvas.supports('setLineDash'),\n\n STROKE_OFFSET = 0.5;\n\n /**\n * Canvas class\n * @class fabric.Canvas\n * @extends fabric.StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n * @see {@link fabric.Canvas#initialize} for constructor definition\n *\n * @fires object:modified\n * @fires object:rotated\n * @fires object:scaled\n * @fires object:moved\n * @fires object:skewed\n * @fires object:rotating\n * @fires object:scaling\n * @fires object:moving\n * @fires object:skewing\n * @fires object:selected this event is deprecated. use selection:created\n *\n * @fires before:transform\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before\n * @fires mouse:move:before\n * @fires mouse:up:before\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n *\n */\n fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n this._initInteractive();\n this._createCacheCanvas();\n },\n\n /**\n * When true, objects can be transformed by one side (unproportionally)\n * @type Boolean\n * @default\n */\n uniScaleTransform: false,\n\n /**\n * Indicates which key enable unproportional scaling\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n uniScaleKey: 'shiftKey',\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: false,\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n centeredKey: 'altKey',\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n altActionKey: 'shiftKey',\n\n /**\n * Indicates that canvas is interactive. This property should not be changed.\n * @type Boolean\n * @default\n */\n interactive: true,\n\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n * @default\n */\n selection: true,\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type String|Array\n * @default\n */\n selectionKey: 'shiftKey',\n\n /**\n * Indicates which key enable alternative selection\n * in case of target overlapping with active object\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|String\n * @default\n */\n altSelectionKey: null,\n\n /**\n * Color of selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(100, 100, 255, 0.3)', // blue\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: [],\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n * @default\n */\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n * @default\n */\n selectionLineWidth: 1,\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n * @default\n */\n selectionFullyContained: false,\n\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type String\n * @default\n */\n hoverCursor: 'move',\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type String\n * @default\n */\n moveCursor: 'move',\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default\n */\n defaultCursor: 'default',\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default\n */\n freeDrawingCursor: 'crosshair',\n\n /**\n * Cursor value used for rotation point\n * @type String\n * @default\n */\n rotationCursor: 'crosshair',\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default\n */\n notAllowedCursor: 'not-allowed',\n\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @default\n */\n containerClass: 'canvas-container',\n\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n * @default\n */\n targetFindTolerance: 0,\n\n /**\n * When true, target detection is skipped when hovering over canvas. This can be used to improve performance.\n * @type Boolean\n * @default\n */\n skipTargetFind: false,\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n * @default\n */\n isDrawingMode: false,\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default\n */\n preserveObjectStacking: false,\n\n /**\n * Indicates the angle that an object will lock to while rotating.\n * @type Number\n * @since 1.6.7\n * @default\n */\n snapAngle: 0,\n\n /**\n * Indicates the distance from the snapAngle the rotation will lock to the snapAngle.\n * When `null`, the snapThreshold will default to the snapAngle.\n * @type null|Number\n * @since 1.6.7\n * @default\n */\n snapThreshold: null,\n\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n stopContextMenu: false,\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n fireRightClick: false,\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n * @default\n */\n fireMiddleClick: false,\n\n /**\n * @private\n */\n _initInteractive: function() {\n this._currentTransform = null;\n this._groupSelector = null;\n this._initWrapperElement();\n this._createUpperCanvas();\n this._initEventListeners();\n\n this._initRetinaScaling();\n\n this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);\n\n this.calcOffset();\n },\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender: function() {\n var activeObjects = this.getActiveObjects(),\n object, objsToRender, activeGroupObjects;\n\n if (activeObjects.length > 0 && !this.preserveObjectStacking) {\n objsToRender = [];\n activeGroupObjects = [];\n for (var i = 0, length = this._objects.length; i < length; i++) {\n object = this._objects[i];\n if (activeObjects.indexOf(object) === -1 ) {\n objsToRender.push(object);\n }\n else {\n activeGroupObjects.push(object);\n }\n }\n if (activeObjects.length > 1) {\n this._activeObject._objects = activeGroupObjects;\n }\n objsToRender.push.apply(objsToRender, activeGroupObjects);\n }\n else {\n objsToRender = this._objects;\n }\n return objsToRender;\n },\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n }\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());\n return this;\n },\n\n renderTopLayer: function(ctx) {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n },\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n renderTop: function () {\n var ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n this.fire('after:render');\n return this;\n },\n\n /**\n * Resets the current transform to its original values and chooses the type of resizing based on the event\n * @private\n */\n _resetCurrentTransform: function() {\n var t = this._currentTransform;\n\n t.target.set({\n scaleX: t.original.scaleX,\n scaleY: t.original.scaleY,\n skewX: t.original.skewX,\n skewY: t.original.skewY,\n left: t.original.left,\n top: t.original.top\n });\n\n if (this._shouldCenterTransform(t.target)) {\n if (t.originX !== 'center') {\n if (t.originX === 'right') {\n t.mouseXSign = -1;\n }\n else {\n t.mouseXSign = 1;\n }\n }\n if (t.originY !== 'center') {\n if (t.originY === 'bottom') {\n t.mouseYSign = -1;\n }\n else {\n t.mouseYSign = 1;\n }\n }\n\n t.originX = 'center';\n t.originY = 'center';\n }\n else {\n t.originX = t.original.originX;\n t.originY = t.original.originY;\n }\n },\n\n /**\n * Checks if point is contained within an area of given object\n * @param {Event} e Event object\n * @param {fabric.Object} target Object to test against\n * @param {Object} [point] x,y object of point coordinates we want to check.\n * @return {Boolean} true if point is contained within an area of given object\n */\n containsPoint: function (e, target, point) {\n var ignoreZoom = true,\n pointer = point || this.getPointer(e, ignoreZoom),\n xy;\n\n if (target.group && target.group === this._activeObject && target.group.type === 'activeSelection') {\n xy = this._normalizePointer(target.group, pointer);\n }\n else {\n xy = { x: pointer.x, y: pointer.y };\n }\n // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html\n // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html\n return (target.containsPoint(xy) || target._findTargetCorner(pointer));\n },\n\n /**\n * @private\n */\n _normalizePointer: function (object, pointer) {\n var m = object.calcTransformMatrix(),\n invertedM = fabric.util.invertTransform(m),\n vptPointer = this.restorePointerVpt(pointer);\n return fabric.util.transformPoint(vptPointer, invertedM);\n },\n\n /**\n * Returns true if object is transparent at a certain location\n * @param {fabric.Object} target Object to check\n * @param {Number} x Left coordinate\n * @param {Number} y Top coordinate\n * @return {Boolean}\n */\n isTargetTransparent: function (target, x, y) {\n // in case the target is the activeObject, we cannot execute this optimization\n // because we need to draw controls too.\n if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {\n var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),\n targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),\n targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);\n\n var isTransparent = fabric.util.isTransparent(\n target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);\n\n return isTransparent;\n }\n\n var ctx = this.contextCache,\n originalColor = target.selectionBackgroundColor, v = this.viewportTransform;\n\n target.selectionBackgroundColor = '';\n\n this.clearContext(ctx);\n\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n target.render(ctx);\n ctx.restore();\n\n target === this._activeObject && target._renderControls(ctx, {\n hasBorders: false,\n transparentCorners: false\n }, {\n hasBorders: false,\n });\n\n target.selectionBackgroundColor = originalColor;\n\n var isTransparent = fabric.util.isTransparent(\n ctx, x, y, this.targetFindTolerance);\n\n return isTransparent;\n },\n\n /**\n * takes an event and determins if selection key has been pressed\n * @private\n * @param {Event} e Event object\n */\n _isSelectionKeyPressed: function(e) {\n var selectionKeyPressed = false;\n\n if (Object.prototype.toString.call(this.selectionKey) === '[object Array]') {\n selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });\n }\n else {\n selectionKeyPressed = e[this.selectionKey];\n }\n\n return selectionKeyPressed;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _shouldClearSelection: function (e, target) {\n var activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return (\n !target\n ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e))\n ||\n (target && !target.evented)\n ||\n (target &&\n !target.selectable &&\n activeObject &&\n activeObject !== target)\n );\n },\n\n /**\n * centeredScaling from object can't override centeredScaling from canvas.\n * this should be fixed, since object setting should take precedence over canvas.\n * @private\n * @param {fabric.Object} target\n */\n _shouldCenterTransform: function (target) {\n if (!target) {\n return;\n }\n\n var t = this._currentTransform,\n centerTransform;\n\n if (t.action === 'scale' || t.action === 'scaleX' || t.action === 'scaleY') {\n centerTransform = this.centeredScaling || target.centeredScaling;\n }\n else if (t.action === 'rotate') {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !t.altKey : t.altKey;\n },\n\n /**\n * @private\n */\n _getOriginFromCorner: function(target, corner) {\n var origin = {\n x: target.originX,\n y: target.originY\n };\n\n if (corner === 'ml' || corner === 'tl' || corner === 'bl') {\n origin.x = 'right';\n }\n else if (corner === 'mr' || corner === 'tr' || corner === 'br') {\n origin.x = 'left';\n }\n\n if (corner === 'tl' || corner === 'mt' || corner === 'tr') {\n origin.y = 'bottom';\n }\n else if (corner === 'bl' || corner === 'mb' || corner === 'br') {\n origin.y = 'top';\n }\n\n return origin;\n },\n\n /**\n * @private\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {fabric.Object} [target] inserted back to help overriding. Unused\n */\n _getActionFromCorner: function(alreadySelected, corner, e /* target */) {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n\n switch (corner) {\n case 'mtr':\n return 'rotate';\n case 'ml':\n case 'mr':\n return e[this.altActionKey] ? 'skewY' : 'scaleX';\n case 'mt':\n case 'mb':\n return e[this.altActionKey] ? 'skewX' : 'scaleY';\n default:\n return 'scale';\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _setupCurrentTransform: function (e, target, alreadySelected) {\n if (!target) {\n return;\n }\n\n var pointer = this.getPointer(e),\n corner = target._findTargetCorner(this.getPointer(e, true)),\n action = this._getActionFromCorner(alreadySelected, corner, e, target),\n origin = this._getOriginFromCorner(target, corner);\n\n this._currentTransform = {\n target: target,\n action: action,\n corner: corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n // used by transation\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n // unsure they are usefull anymore.\n // left: target.left,\n // top: target.top,\n theta: degreesToRadians(target.angle),\n // end of unsure\n width: target.width * target.scaleX,\n mouseXSign: 1,\n mouseYSign: 1,\n shiftKey: e.shiftKey,\n altKey: e[this.centeredKey],\n original: fabric.util.saveObjectTransform(target),\n };\n\n this._currentTransform.original.originX = origin.x;\n this._currentTransform.original.originY = origin.y;\n\n this._resetCurrentTransform();\n this._beforeTransform(e);\n },\n\n /**\n * Translates object by \"setting\" its left/top\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @return {Boolean} true if the translation occurred\n */\n _translateObject: function (x, y) {\n var transform = this._currentTransform,\n target = transform.target,\n newLeft = x - transform.offsetX,\n newTop = y - transform.offsetY,\n moveX = !target.get('lockMovementX') && target.left !== newLeft,\n moveY = !target.get('lockMovementY') && target.top !== newTop;\n\n moveX && target.set('left', newLeft);\n moveY && target.set('top', newTop);\n return moveX || moveY;\n },\n\n /**\n * Check if we are increasing a positive skew or lower it,\n * checking mouse direction and pressed corner.\n * @private\n */\n _changeSkewTransformOrigin: function(mouseMove, t, by) {\n var property = 'originX', origins = { 0: 'center' },\n skew = t.target.skewX, originA = 'left', originB = 'right',\n corner = t.corner === 'mt' || t.corner === 'ml' ? 1 : -1,\n flipSign = 1;\n\n mouseMove = mouseMove > 0 ? 1 : -1;\n if (by === 'y') {\n skew = t.target.skewY;\n originA = 'top';\n originB = 'bottom';\n property = 'originY';\n }\n origins[-1] = originA;\n origins[1] = originB;\n\n t.target.flipX && (flipSign *= -1);\n t.target.flipY && (flipSign *= -1);\n\n if (skew === 0) {\n t.skewSign = -corner * mouseMove * flipSign;\n t[property] = origins[-mouseMove];\n }\n else {\n skew = skew > 0 ? 1 : -1;\n t.skewSign = skew;\n t[property] = origins[skew * corner * flipSign];\n }\n },\n\n /**\n * Skew object by mouse events\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @param {String} by Either 'x' or 'y'\n * @return {Boolean} true if the skewing occurred\n */\n _skewObject: function (x, y, by) {\n var t = this._currentTransform,\n target = t.target, skewed = false,\n lockSkewingX = target.get('lockSkewingX'),\n lockSkewingY = target.get('lockSkewingY');\n\n if ((lockSkewingX && by === 'x') || (lockSkewingY && by === 'y')) {\n return false;\n }\n\n // Get the constraint point\n var center = target.getCenterPoint(),\n actualMouseByCenter = target.toLocalPoint(new fabric.Point(x, y), 'center', 'center')[by],\n lastMouseByCenter = target.toLocalPoint(new fabric.Point(t.lastX, t.lastY), 'center', 'center')[by],\n actualMouseByOrigin, constraintPosition, dim = target._getTransformedDimensions();\n\n this._changeSkewTransformOrigin(actualMouseByCenter - lastMouseByCenter, t, by);\n actualMouseByOrigin = target.toLocalPoint(new fabric.Point(x, y), t.originX, t.originY)[by];\n constraintPosition = target.translateToOriginPoint(center, t.originX, t.originY);\n // Actually skew the object\n skewed = this._setObjectSkew(actualMouseByOrigin, t, by, dim);\n t.lastX = x;\n t.lastY = y;\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n return skewed;\n },\n\n /**\n * Set object skew\n * @private\n * @return {Boolean} true if the skewing occurred\n */\n _setObjectSkew: function(localMouse, transform, by, _dim) {\n var target = transform.target, newValue, skewed = false,\n skewSign = transform.skewSign, newDim, dimNoSkew,\n otherBy, _otherBy, _by, newDimMouse, skewX, skewY;\n\n if (by === 'x') {\n otherBy = 'y';\n _otherBy = 'Y';\n _by = 'X';\n skewX = 0;\n skewY = target.skewY;\n }\n else {\n otherBy = 'x';\n _otherBy = 'X';\n _by = 'Y';\n skewX = target.skewX;\n skewY = 0;\n }\n\n dimNoSkew = target._getTransformedDimensions(skewX, skewY);\n newDimMouse = 2 * Math.abs(localMouse) - dimNoSkew[by];\n if (newDimMouse <= 2) {\n newValue = 0;\n }\n else {\n newValue = skewSign * Math.atan((newDimMouse / target['scale' + _by]) /\n (dimNoSkew[otherBy] / target['scale' + _otherBy]));\n newValue = fabric.util.radiansToDegrees(newValue);\n }\n skewed = target['skew' + _by] !== newValue;\n target.set('skew' + _by, newValue);\n if (target['skew' + _otherBy] !== 0) {\n newDim = target._getTransformedDimensions();\n newValue = (_dim[otherBy] / newDim[otherBy]) * target['scale' + _otherBy];\n target.set('scale' + _otherBy, newValue);\n }\n return skewed;\n },\n\n /**\n * Scales object by invoking its scaleX/scaleY methods\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @param {String} by Either 'x' or 'y' - specifies dimension constraint by which to scale an object.\n * When not provided, an object is scaled by both dimensions equally\n * @return {Boolean} true if the scaling occurred\n */\n _scaleObject: function (x, y, by) {\n var t = this._currentTransform,\n target = t.target,\n lockScalingX = target.lockScalingX,\n lockScalingY = target.lockScalingY,\n lockScalingFlip = target.lockScalingFlip;\n\n if (lockScalingX && lockScalingY) {\n return false;\n }\n\n // Get the constraint point\n var constraintPosition = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY),\n localMouse = target.toLocalPoint(new fabric.Point(x, y), t.originX, t.originY),\n dim = target._getTransformedDimensions(), scaled = false;\n\n this._setLocalMouse(localMouse, t);\n\n // Actually scale the object\n scaled = this._setObjectScale(localMouse, t, lockScalingX, lockScalingY, by, lockScalingFlip, dim);\n\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n return scaled;\n },\n\n /**\n * @private\n * @return {Boolean} true if the scaling occurred\n */\n _setObjectScale: function(localMouse, transform, lockScalingX, lockScalingY, by, lockScalingFlip, _dim) {\n var target = transform.target, forbidScalingX = false, forbidScalingY = false, scaled = false,\n scaleX = localMouse.x * target.scaleX / _dim.x,\n scaleY = localMouse.y * target.scaleY / _dim.y,\n changeX = target.scaleX !== scaleX,\n changeY = target.scaleY !== scaleY;\n\n transform.newScaleX = scaleX;\n transform.newScaleY = scaleY;\n if (by === 'x' && target instanceof fabric.Textbox) {\n var w = target.width * (localMouse.x / _dim.x);\n if (w >= target.getMinWidth()) {\n scaled = w !== target.width;\n target.set('width', w);\n return scaled;\n }\n return false;\n }\n\n if (lockScalingFlip && scaleX <= 0 && scaleX < target.scaleX) {\n forbidScalingX = true;\n localMouse.x = 0;\n }\n\n if (lockScalingFlip && scaleY <= 0 && scaleY < target.scaleY) {\n forbidScalingY = true;\n localMouse.y = 0;\n }\n\n if (by === 'equally' && !lockScalingX && !lockScalingY) {\n scaled = this._scaleObjectEqually(localMouse, target, transform, _dim);\n }\n else if (!by) {\n forbidScalingX || lockScalingX || (target.set('scaleX', scaleX) && (scaled = scaled || changeX));\n forbidScalingY || lockScalingY || (target.set('scaleY', scaleY) && (scaled = scaled || changeY));\n }\n else if (by === 'x' && !target.get('lockUniScaling')) {\n forbidScalingX || lockScalingX || (target.set('scaleX', scaleX) && (scaled = changeX));\n }\n else if (by === 'y' && !target.get('lockUniScaling')) {\n forbidScalingY || lockScalingY || (target.set('scaleY', scaleY) && (scaled = changeY));\n }\n forbidScalingX || forbidScalingY || this._flipObject(transform, by);\n return scaled;\n },\n\n /**\n * @private\n * @return {Boolean} true if the scaling occurred\n */\n _scaleObjectEqually: function(localMouse, target, transform, _dim) {\n\n var dist = localMouse.y + localMouse.x,\n lastDist = _dim.y * transform.original.scaleY / target.scaleY +\n _dim.x * transform.original.scaleX / target.scaleX,\n scaled, signX = localMouse.x < 0 ? -1 : 1,\n signY = localMouse.y < 0 ? -1 : 1, newScaleX, newScaleY;\n\n // We use transform.scaleX/Y instead of target.scaleX/Y\n // because the object may have a min scale and we'll loose the proportions\n newScaleX = signX * Math.abs(transform.original.scaleX * dist / lastDist);\n newScaleY = signY * Math.abs(transform.original.scaleY * dist / lastDist);\n scaled = newScaleX !== target.scaleX || newScaleY !== target.scaleY;\n target.set('scaleX', newScaleX);\n target.set('scaleY', newScaleY);\n return scaled;\n },\n\n /**\n * @private\n */\n _flipObject: function(transform, by) {\n if (transform.newScaleX < 0 && by !== 'y') {\n if (transform.originX === 'left') {\n transform.originX = 'right';\n }\n else if (transform.originX === 'right') {\n transform.originX = 'left';\n }\n }\n\n if (transform.newScaleY < 0 && by !== 'x') {\n if (transform.originY === 'top') {\n transform.originY = 'bottom';\n }\n else if (transform.originY === 'bottom') {\n transform.originY = 'top';\n }\n }\n },\n\n /**\n * @private\n */\n _setLocalMouse: function(localMouse, t) {\n var target = t.target, zoom = this.getZoom(),\n padding = target.padding / zoom;\n\n if (t.originX === 'right') {\n localMouse.x *= -1;\n }\n else if (t.originX === 'center') {\n localMouse.x *= t.mouseXSign * 2;\n if (localMouse.x < 0) {\n t.mouseXSign = -t.mouseXSign;\n }\n }\n\n if (t.originY === 'bottom') {\n localMouse.y *= -1;\n }\n else if (t.originY === 'center') {\n localMouse.y *= t.mouseYSign * 2;\n if (localMouse.y < 0) {\n t.mouseYSign = -t.mouseYSign;\n }\n }\n\n // adjust the mouse coordinates when dealing with padding\n if (abs(localMouse.x) > padding) {\n if (localMouse.x < 0) {\n localMouse.x += padding;\n }\n else {\n localMouse.x -= padding;\n }\n }\n else { // mouse is within the padding, set to 0\n localMouse.x = 0;\n }\n\n if (abs(localMouse.y) > padding) {\n if (localMouse.y < 0) {\n localMouse.y += padding;\n }\n else {\n localMouse.y -= padding;\n }\n }\n else {\n localMouse.y = 0;\n }\n },\n\n /**\n * Rotates object by invoking its rotate method\n * @private\n * @param {Number} x pointer's x coordinate\n * @param {Number} y pointer's y coordinate\n * @return {Boolean} true if the rotation occurred\n */\n _rotateObject: function (x, y) {\n\n var t = this._currentTransform,\n target = t.target, constraintPosition,\n constraintPosition = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY);\n\n if (target.lockRotation) {\n return false;\n }\n\n var lastAngle = atan2(t.ey - constraintPosition.y, t.ex - constraintPosition.x),\n curAngle = atan2(y - constraintPosition.y, x - constraintPosition.x),\n angle = radiansToDegrees(curAngle - lastAngle + t.theta),\n hasRotated = true;\n\n if (target.snapAngle > 0) {\n var snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n }\n else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n if (target.angle === angle) {\n hasRotated = false;\n }\n else {\n // rotation only happen here\n target.angle = angle;\n // Make sure the constraints apply\n target.setPositionByOrigin(constraintPosition, t.originX, t.originY);\n }\n\n return hasRotated;\n },\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor: function (value) {\n this.upperCanvasEl.style.cursor = value;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection: function (ctx) {\n var groupSelector = this._groupSelector,\n left = groupSelector.left,\n top = groupSelector.top,\n aleft = abs(left),\n atop = abs(top);\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n\n ctx.fillRect(\n groupSelector.ex - ((left > 0) ? 0 : -left),\n groupSelector.ey - ((top > 0) ? 0 : -top),\n aleft,\n atop\n );\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n // selection border\n if (this.selectionDashArray.length > 1 && !supportLineDash) {\n\n var px = groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft),\n py = groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop);\n\n ctx.beginPath();\n\n fabric.util.drawDashedLine(ctx, px, py, px + aleft, py, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px, py + atop - 1, px + aleft, py + atop - 1, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px, py, px, py + atop, this.selectionDashArray);\n fabric.util.drawDashedLine(ctx, px + aleft - 1, py, px + aleft - 1, py + atop, this.selectionDashArray);\n\n ctx.closePath();\n ctx.stroke();\n }\n else {\n fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);\n ctx.strokeRect(\n groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft),\n groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop),\n aleft,\n atop\n );\n }\n },\n\n /**\n * Method that determines what object we are clicking on\n * the skipGroup parameter is for internal use, is needed for shift+click action\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through\n * @return {fabric.Object} the target found\n */\n findTarget: function (e, skipGroup) {\n if (this.skipTargetFind) {\n return;\n }\n\n var ignoreZoom = true,\n pointer = this.getPointer(e, ignoreZoom),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n activeTarget, activeTargetSubs;\n\n // first check current group (if one exists)\n // active group does not check sub targets like normal groups.\n // if active group just exits.\n this.targets = [];\n\n if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n return activeObject;\n }\n // if we hit the corner of an activeObject, let's return that.\n if (aObjects.length === 1 && activeObject._findTargetCorner(pointer)) {\n return activeObject;\n }\n if (aObjects.length === 1 &&\n activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n if (!this.preserveObjectStacking) {\n return activeObject;\n }\n else {\n activeTarget = activeObject;\n activeTargetSubs = this.targets;\n this.targets = [];\n }\n }\n var target = this._searchPossibleTargets(this._objects, pointer);\n if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {\n target = activeTarget;\n this.targets = activeTargetSubs;\n }\n return target;\n },\n\n /**\n * Checks point is inside the object.\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @param {fabric.Object} obj Object to test against\n * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget: function(pointer, obj, globalPointer) {\n if (obj &&\n obj.visible &&\n obj.evented &&\n this.containsPoint(null, obj, pointer)){\n if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {\n var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);\n if (!isTransparent) {\n return true;\n }\n }\n else {\n return true;\n }\n }\n },\n\n /**\n * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted\n * @param {Array} [objects] objects array to look into\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @return {fabric.Object} object that contains pointer\n * @private\n */\n _searchPossibleTargets: function(objects, pointer) {\n // Cache all targets where their bounding box contains point.\n var target, i = objects.length, subTarget;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n var objToCheck = objects[i];\n var pointerToUse = objToCheck.group && objToCheck.group.type !== 'activeSelection' ?\n this._normalizePointer(objToCheck.group, pointer) : pointer;\n if (this._checkTarget(pointerToUse, objToCheck, pointer)) {\n target = objects[i];\n if (target.subTargetCheck && target instanceof fabric.Group) {\n subTarget = this._searchPossibleTargets(target._objects, pointer);\n subTarget && this.targets.push(subTarget);\n }\n break;\n }\n }\n return target;\n },\n\n /**\n * Returns pointer coordinates without the effect of the viewport\n * @param {Object} pointer with \"x\" and \"y\" number values\n * @return {Object} object with \"x\" and \"y\" number values\n */\n restorePointerVpt: function(pointer) {\n return fabric.util.transformPoint(\n pointer,\n fabric.util.invertTransform(this.viewportTransform)\n );\n },\n\n /**\n * Returns pointer coordinates relative to canvas.\n * Can return coordinates with or without viewportTransform.\n * ignoreZoom false gives back coordinates that represent\n * the point clicked on canvas element.\n * ignoreZoom true gives back coordinates after being processed\n * by the viewportTransform ( sort of coordinates of what is displayed\n * on the canvas where you are clicking.\n * ignoreZoom true = HTMLElement coordinates relative to top,left\n * ignoreZoom false, default = fabric space coordinates, the same used for shape position\n * To interact with your shapes top and left you want to use ignoreZoom true\n * most of the time, while ignoreZoom false will give you coordinates\n * compatible with the object.oCoords system.\n * of the time.\n * @param {Event} e\n * @param {Boolean} ignoreZoom\n * @return {Object} object with \"x\" and \"y\" number values\n */\n getPointer: function (e, ignoreZoom) {\n // return cached values if we are in the event processing chain\n if (this._absolutePointer && !ignoreZoom) {\n return this._absolutePointer;\n }\n if (this._pointer && ignoreZoom) {\n return this._pointer;\n }\n\n var pointer = getPointer(e),\n upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect(),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0,\n cssScale;\n\n if (!boundsWidth || !boundsHeight ) {\n if ('top' in bounds && 'bottom' in bounds) {\n boundsHeight = Math.abs( bounds.top - bounds.bottom );\n }\n if ('right' in bounds && 'left' in bounds) {\n boundsWidth = Math.abs( bounds.right - bounds.left );\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!ignoreZoom) {\n pointer = this.restorePointerVpt(pointer);\n }\n\n if (boundsWidth === 0 || boundsHeight === 0) {\n // If bounds are not available (i.e. not visible), do not apply scale.\n cssScale = { width: 1, height: 1 };\n }\n else {\n cssScale = {\n width: upperCanvasEl.width / boundsWidth,\n height: upperCanvasEl.height / boundsHeight\n };\n }\n\n return {\n x: pointer.x * cssScale.width,\n y: pointer.y * cssScale.height\n };\n },\n\n /**\n * @private\n * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized\n */\n _createUpperCanvas: function () {\n var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\\s*lower-canvas\\s*/, '');\n\n // there is no need to create a new upperCanvas element if we have already one.\n if (this.upperCanvasEl) {\n this.upperCanvasEl.className = '';\n }\n else {\n this.upperCanvasEl = this._createCanvasElement();\n }\n fabric.util.addClass(this.upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);\n\n this.wrapperEl.appendChild(this.upperCanvasEl);\n\n this._copyCanvasStyle(this.lowerCanvasEl, this.upperCanvasEl);\n this._applyCanvasStyle(this.upperCanvasEl);\n this.contextTop = this.upperCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _createCacheCanvas: function () {\n this.cacheCanvasEl = this._createCanvasElement();\n this.cacheCanvasEl.setAttribute('width', this.width);\n this.cacheCanvasEl.setAttribute('height', this.height);\n this.contextCache = this.cacheCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _initWrapperElement: function () {\n this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {\n 'class': this.containerClass\n });\n fabric.util.setStyle(this.wrapperEl, {\n width: this.width + 'px',\n height: this.height + 'px',\n position: 'relative'\n });\n fabric.util.makeElementUnselectable(this.wrapperEl);\n },\n\n /**\n * @private\n * @param {HTMLElement} element canvas element to apply styles on\n */\n _applyCanvasStyle: function (element) {\n var width = this.width || element.width,\n height = this.height || element.height;\n\n fabric.util.setStyle(element, {\n position: 'absolute',\n width: width + 'px',\n height: height + 'px',\n left: 0,\n top: 0,\n 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',\n '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'\n });\n element.width = width;\n element.height = height;\n fabric.util.makeElementUnselectable(element);\n },\n\n /**\n * Copy the entire inline style from one element (fromEl) to another (toEl)\n * @private\n * @param {Element} fromEl Element style is copied from\n * @param {Element} toEl Element copied style is applied to\n */\n _copyCanvasStyle: function (fromEl, toEl) {\n toEl.style.cssText = fromEl.style.cssText;\n },\n\n /**\n * Returns context of canvas where object selection is drawn\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext: function() {\n return this.contextTop;\n },\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement: function () {\n return this.upperCanvasEl;\n },\n\n /**\n * Returns currently active object\n * @return {fabric.Object} active object\n */\n getActiveObject: function () {\n return this._activeObject;\n },\n\n /**\n * Returns an array with the current selected objects\n * @return {fabric.Object} active object\n */\n getActiveObjects: function () {\n var active = this._activeObject;\n if (active) {\n if (active.type === 'activeSelection' && active._objects) {\n return active._objects.slice(0);\n }\n else {\n return [active];\n }\n }\n return [];\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { target: obj });\n this._discardActiveObject();\n this.fire('selection:cleared', { target: obj });\n obj.fire('deselected');\n }\n if (this._hoveredTarget === obj) {\n this._hoveredTarget = null;\n }\n this.callSuper('_onObjectRemoved', obj);\n },\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {fabric.Object} obj old activeObject\n */\n _fireSelectionEvents: function(oldObjects, e) {\n var somethingChanged = false, objects = this.getActiveObjects(),\n added = [], removed = [], opt = { e: e };\n oldObjects.forEach(function(oldObject) {\n if (objects.indexOf(oldObject) === -1) {\n somethingChanged = true;\n oldObject.fire('deselected', opt);\n removed.push(oldObject);\n }\n });\n objects.forEach(function(object) {\n if (oldObjects.indexOf(object) === -1) {\n somethingChanged = true;\n object.fire('selected', opt);\n added.push(object);\n }\n });\n if (oldObjects.length > 0 && objects.length > 0) {\n opt.selected = added;\n opt.deselected = removed;\n // added for backward compatibility\n opt.updated = added[0] || removed[0];\n opt.target = this._activeObject;\n somethingChanged && this.fire('selection:updated', opt);\n }\n else if (objects.length > 0) {\n // deprecated event\n if (objects.length === 1) {\n opt.target = added[0];\n this.fire('object:selected', opt);\n }\n opt.selected = added;\n // added for backward compatibility\n opt.target = this._activeObject;\n this.fire('selection:created', opt);\n }\n else if (oldObjects.length > 0) {\n opt.deselected = removed;\n this.fire('selection:cleared', opt);\n }\n },\n\n /**\n * Sets given object as the only active object on canvas\n * @param {fabric.Object} object Object to set as an active one\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setActiveObject: function (object, e) {\n var currentActives = this.getActiveObjects();\n this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * @private\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the selection happened\n */\n _setActiveObject: function(object, e) {\n if (this._activeObject === object) {\n return false;\n }\n if (!this._discardActiveObject(e, object)) {\n return false;\n }\n if (object.onSelect({ e: e })) {\n return false;\n }\n this._activeObject = object;\n return true;\n },\n\n /**\n * @private\n */\n _discardActiveObject: function(e, object) {\n var obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e: e, object: object })) {\n return false;\n }\n this._activeObject = null;\n }\n return true;\n },\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n discardActiveObject: function (e) {\n var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', { target: activeObject, e: e });\n }\n this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * Clears a canvas element and removes all event listeners\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n var wrapper = this.wrapperEl;\n this.removeListeners();\n wrapper.removeChild(this.upperCanvasEl);\n wrapper.removeChild(this.lowerCanvasEl);\n this.contextCache = null;\n this.contextTop = null;\n ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n if (wrapper.parentNode) {\n wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);\n }\n delete this.wrapperEl;\n fabric.StaticCanvas.prototype.dispose.call(this);\n return this;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n // this.discardActiveGroup();\n this.discardActiveObject();\n this.clearContext(this.contextTop);\n return this.callSuper('clear');\n },\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls: function(ctx) {\n var activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n //If the object is part of the current selection group, it should\n //be transformed appropriately\n //i.e. it should be serialised as it would appear if the selection group\n //were to be destroyed.\n var originalProperties = this._realizeGroupTransformOnObject(instance),\n object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n this._unwindGroupTransformOnObject(instance, originalProperties);\n return object;\n },\n\n /**\n * Realises an object's group transformation on it\n * @private\n * @param {fabric.Object} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n _realizeGroupTransformOnObject: function(instance) {\n if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {\n var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];\n //Copy all the positionally relevant properties across now\n var originalValues = {};\n layoutProps.forEach(function(prop) {\n originalValues[prop] = instance[prop];\n });\n this._activeObject.realizeTransform(instance);\n return originalValues;\n }\n else {\n return null;\n }\n },\n\n /**\n * Restores the changed properties of instance\n * @private\n * @param {fabric.Object} [instance] the object to un-transform (gets mutated)\n * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject\n */\n _unwindGroupTransformOnObject: function(instance, originalValues) {\n if (originalValues) {\n instance.set(originalValues);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n //If the object is in a selection group, simulate what would happen to that\n //object when the group is deselected\n var originalProperties = this._realizeGroupTransformOnObject(instance);\n this.callSuper('_setSVGObject', markup, instance, reviver);\n this._unwindGroupTransformOnObject(instance, originalProperties);\n },\n\n setViewportTransform: function (vpt) {\n if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {\n this._activeObject.clearContextTop();\n }\n fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);\n }\n });\n\n // copying static properties manually to work around Opera's bug,\n // where \"prototype\" property is enumerable and overrides existing prototype\n for (var prop in fabric.StaticCanvas) {\n if (prop !== 'prototype') {\n fabric.Canvas[prop] = fabric.StaticCanvas[prop];\n }\n }\n})();\n\n\n(function() {\n\n var cursorOffset = {\n mt: 0, // n\n tr: 1, // ne\n mr: 2, // e\n br: 3, // se\n mb: 4, // s\n bl: 5, // sw\n ml: 6, // w\n tl: 7 // nw\n },\n addListener = fabric.util.addListener,\n removeListener = fabric.util.removeListener,\n RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1,\n addEventOptions = { passive: false };\n\n function checkClick(e, value) {\n return e.button && (e.button === value - 1);\n }\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Map of cursor style values for each of the object controls\n * @private\n */\n cursorMap: [\n 'n-resize',\n 'ne-resize',\n 'e-resize',\n 'se-resize',\n 's-resize',\n 'sw-resize',\n 'w-resize',\n 'nw-resize'\n ],\n\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n mainTouchId: null,\n\n /**\n * Adds mouse listeners to canvas\n * @private\n */\n _initEventListeners: function () {\n // in case we initialized the class twice. This should not happen normally\n // but in some kind of applications where the canvas element may be changed\n // this is a workaround to having double listeners.\n this.removeListeners();\n this._bindEvents();\n this.addOrRemove(addListener, 'add');\n },\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n _getEventPrefix: function () {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n },\n\n addOrRemove: function(functor, eventjsFunctor) {\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(fabric.window, 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut);\n functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'dblclick', this._onDoubleClick);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange);\n eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n }\n },\n\n /**\n * Removes all event listeners\n */\n removeListeners: function() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n */\n _bindEvents: function() {\n if (this.eventsBound) {\n // for any reason we pass here twice we do not want to bind events twice.\n return;\n }\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onTouchStart = this._onTouchStart.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._onTouchEnd = this._onTouchEnd.bind(this);\n this._onResize = this._onResize.bind(this);\n this._onGesture = this._onGesture.bind(this);\n this._onDrag = this._onDrag.bind(this);\n this._onShake = this._onShake.bind(this);\n this._onLongPress = this._onLongPress.bind(this);\n this._onOrientationChange = this._onOrientationChange.bind(this);\n this._onMouseWheel = this._onMouseWheel.bind(this);\n this._onMouseOut = this._onMouseOut.bind(this);\n this._onMouseEnter = this._onMouseEnter.bind(this);\n this._onContextMenu = this._onContextMenu.bind(this);\n this._onDoubleClick = this._onDoubleClick.bind(this);\n this._onDragOver = this._onDragOver.bind(this);\n this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter');\n this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave');\n this._onDrop = this._simpleEventHandler.bind(this, 'drop');\n this.eventsBound = true;\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js gesture\n * @param {Event} [self] Inner Event object\n */\n _onGesture: function(e, self) {\n this.__onTransformGesture && this.__onTransformGesture(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js drag\n * @param {Event} [self] Inner Event object\n */\n _onDrag: function(e, self) {\n this.__onDrag && this.__onDrag(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n _onMouseWheel: function(e) {\n this.__onMouseWheel(e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseOut: function(e) {\n var target = this._hoveredTarget;\n this.fire('mouse:out', { target: target, e: e });\n this._hoveredTarget = null;\n target && target.fire('mouseout', { e: e });\n if (this._iTextInstances) {\n this._iTextInstances.forEach(function(obj) {\n if (obj.isEditing) {\n obj.hiddenTextarea.focus();\n }\n });\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseenter\n */\n _onMouseEnter: function(e) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n if (!this.currentTransform && !this.findTarget(e)) {\n this.fire('mouse:over', { target: null, e: e });\n this._hoveredTarget = null;\n }\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js orientation change\n * @param {Event} [self] Inner Event object\n */\n _onOrientationChange: function(e, self) {\n this.__onOrientationChange && this.__onOrientationChange(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onShake: function(e, self) {\n this.__onShake && this.__onShake(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onLongPress: function(e, self) {\n this.__onLongPress && this.__onLongPress(e, self);\n },\n\n /**\n * prevent default to allow drop event to be fired\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n _onDragOver: function(e) {\n e.preventDefault();\n var target = this._simpleEventHandler('dragover', e);\n this._fireEnterLeaveEvents(target, e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onContextMenu: function (e) {\n if (this.stopContextMenu) {\n e.stopPropagation();\n e.preventDefault();\n }\n return false;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onDoubleClick: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'dblclick');\n this._resetTransformEventData(e);\n },\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId: function(evt) {\n var changedTouches = evt.changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return evt.pointerId;\n }\n\n return -1;\n },\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent: function(evt) {\n if (evt.isPrimary === true) {\n return true;\n }\n if (evt.isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && evt.touches.length === 0) {\n return true;\n }\n if (evt.changedTouches) {\n return evt.changedTouches[0].identifier === this.mainTouchId;\n }\n return true;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart: function(e) {\n e.preventDefault();\n if (this.mainTouchId === null) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown: function (e) {\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd: function(e) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this.__onMouseUp(e);\n this._resetTransformEventData();\n this.mainTouchId = null;\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n var _this = this;\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(function() {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown);\n _this._willAddMouseDown = 0;\n }, 400);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp: function (e) {\n this.__onMouseUp(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove: function (e) {\n !this.allowTouchScrolling && e.preventDefault && e.preventDefault();\n this.__onMouseMove(e);\n },\n\n /**\n * @private\n */\n _onResize: function () {\n this.calcOffset();\n },\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender: function(target) {\n var activeObject = this._activeObject;\n\n if (\n !!activeObject !== !!target ||\n (activeObject && target && (activeObject !== target))\n ) {\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return true;\n }\n else if (activeObject && activeObject.isEditing) {\n // if we mouse up/down over a editing textbox a cursor change,\n // there is no need to re render\n return false;\n }\n return false;\n },\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp: function (e) {\n var target, transform = this._currentTransform,\n groupSelector = this._groupSelector, shouldRender = false,\n isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0));\n this._cacheTransformEventData(e);\n target = this._target;\n this._handleEvent(e, 'up:before');\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'up', RIGHT_CLICK, isClick);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'up', MIDDLE_CLICK, isClick);\n }\n this._resetTransformEventData();\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n\n if (!isClick) {\n this._maybeGroupObjects(e);\n shouldRender || (shouldRender = this._shouldRender(target));\n }\n if (target) {\n target.isMoving = false;\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up', LEFT_CLICK, isClick);\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = 0);\n if (shouldRender) {\n this.requestRenderAll();\n }\n else if (!isClick) {\n this.renderTop();\n }\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @return {Fabric.Object} target return the the target found, for internal reasons.\n */\n _simpleEventHandler: function(eventType, e) {\n var target = this.findTarget(e),\n targets = this.targets,\n options = {\n e: e,\n target: target,\n subTargets: targets,\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n if (!targets) {\n return target;\n }\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire(eventType, options);\n }\n return target;\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @param {fabric.Object} targetObj receiving event\n * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right\n * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move.\n */\n _handleEvent: function(e, eventType, button, isClick) {\n var target = this._target,\n targets = this.targets || [],\n options = {\n e: e,\n target: target,\n subTargets: targets,\n button: button || LEFT_CLICK,\n isClick: isClick || false,\n pointer: this._pointer,\n absolutePointer: this._absolutePointer,\n transform: this._currentTransform\n };\n this.fire('mouse:' + eventType, options);\n target && target.fire('mouse' + eventType, options);\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire('mouse' + eventType, options);\n }\n },\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform: function(e) {\n\n var transform = this._currentTransform,\n target = transform.target,\n eventName,\n options = {\n e: e,\n target: target,\n transform: transform,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) {\n if (transform.actionPerformed) {\n eventName = this._addEventOptions(options, transform);\n this._fire(eventName, options);\n }\n this._fire('modified', options);\n }\n },\n\n /**\n * Mutate option object in order to add by property and give back the event name.\n * @private\n * @param {Object} options to mutate\n * @param {Object} transform to inspect action from\n */\n _addEventOptions: function(options, transform) {\n // we can probably add more details at low cost\n // scale change, rotation changes, translation changes\n var eventName, by;\n switch (transform.action) {\n case 'scaleX':\n eventName = 'scaled';\n by = 'x';\n break;\n case 'scaleY':\n eventName = 'scaled';\n by = 'y';\n break;\n case 'skewX':\n eventName = 'skewed';\n by = 'x';\n break;\n case 'skewY':\n eventName = 'skewed';\n by = 'y';\n break;\n case 'scale':\n eventName = 'scaled';\n by = 'equally';\n break;\n case 'rotate':\n eventName = 'rotated';\n break;\n case 'drag':\n eventName = 'moved';\n break;\n }\n options.by = by;\n return eventName;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode: function(e) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e).requestRenderAll();\n }\n if (this.clipTo) {\n fabric.util.clipContext(this, this.contextTop);\n }\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer });\n this._handleEvent(e, 'down');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode: function(e) {\n if (this._isCurrentlyDrawing) {\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode: function(e) {\n if (this.clipTo) {\n this.contextTop.restore();\n }\n var pointer = this.getPointer(e);\n this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer });\n this._handleEvent(e, 'up');\n },\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'down:before');\n var target = this._target;\n // if right click just fire events\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'down', RIGHT_CLICK);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'down', MIDDLE_CLICK);\n }\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n var pointer = this._pointer;\n // save pointer for check in __onMouseUp event\n this._previousPointer = pointer;\n var shouldRender = this._shouldRender(target),\n shouldGroup = this._shouldGroup(e, target);\n if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n else if (shouldGroup) {\n this._handleGrouping(e, target);\n target = this._activeObject;\n }\n\n if (this.selection && (!target ||\n (!target.selectable && !target.isEditing && target !== this._activeObject))) {\n this._groupSelector = {\n ex: pointer.x,\n ey: pointer.y,\n top: 0,\n left: 0\n };\n }\n\n if (target) {\n var alreadySelected = target === this._activeObject;\n if (target.selectable) {\n this.setActiveObject(target, e);\n }\n if (target === this._activeObject && (target.__corner || !shouldGroup)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n }\n }\n this._handleEvent(e, 'down');\n // we must renderAll so that we update the visuals\n (shouldRender || shouldGroup) && this.requestRenderAll();\n },\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData: function() {\n this._target = null;\n this._pointer = null;\n this._absolutePointer = null;\n },\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData: function(e) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._pointer = this.getPointer(e, true);\n this._absolutePointer = this.restorePointerVpt(this._pointer);\n this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null;\n },\n\n /**\n * @private\n */\n _beforeTransform: function(e) {\n var t = this._currentTransform;\n this.stateful && t.target.saveState();\n this.fire('before:transform', {\n e: e,\n transform: t,\n });\n // determine if it's a drag or rotate case\n if (t.corner) {\n this.onBeforeScaleRotate(t.target);\n }\n },\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove: function (e) {\n this._handleEvent(e, 'move:before');\n this._cacheTransformEventData(e);\n var target, pointer;\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n var groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n pointer = this._pointer;\n\n groupSelector.left = pointer.x - groupSelector.ex;\n groupSelector.top = pointer.y - groupSelector.ey;\n\n this.renderTop();\n }\n else if (!this._currentTransform) {\n target = this.findTarget(e) || null;\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(target, e);\n }\n else {\n this._transformObject(e);\n }\n this._handleEvent(e, 'move');\n this._resetTransformEventData();\n },\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents: function(target, e) {\n this.fireSyntheticInOutEvents(target, e, {\n targetName: '_hoveredTarget',\n canvasEvtOut: 'mouse:out',\n evtOut: 'mouseout',\n canvasEvtIn: 'mouse:over',\n evtIn: 'mouseover',\n });\n },\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Event} e Event object fired on ondrag\n * @private\n */\n _fireEnterLeaveEvents: function(target, e) {\n this.fireSyntheticInOutEvents(target, e, {\n targetName: '_draggedoverTarget',\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n },\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Event} e Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents: function(target, e, config) {\n var inOpt, outOpt, oldTarget = this[config.targetName], outFires, inFires,\n targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut;\n if (targetChanged) {\n inOpt = { e: e, target: target, previousTarget: oldTarget };\n outOpt = { e: e, target: oldTarget, nextTarget: target };\n this[config.targetName] = target;\n }\n inFires = target && targetChanged;\n outFires = oldTarget && targetChanged;\n if (outFires) {\n canvasEvtOut && this.fire(canvasEvtOut, outOpt);\n oldTarget.fire(config.evtOut, outOpt);\n }\n if (inFires) {\n canvasEvtIn && this.fire(canvasEvtIn, inOpt);\n target.fire(config.evtIn, inOpt);\n }\n },\n\n /**\n * Method that defines actions when an Event Mouse Wheel\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseWheel: function(e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n },\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject: function(e) {\n var pointer = this.getPointer(e),\n transform = this._currentTransform;\n\n transform.reset = false;\n transform.target.isMoving = true;\n transform.shiftKey = e.shiftKey;\n transform.altKey = e[this.centeredKey];\n\n this._beforeScaleTransform(e, transform);\n this._performTransformAction(e, transform, pointer);\n\n transform.actionPerformed && this.requestRenderAll();\n },\n\n /**\n * @private\n */\n _performTransformAction: function(e, transform, pointer) {\n var x = pointer.x,\n y = pointer.y,\n action = transform.action,\n actionPerformed = false,\n options = {\n target: transform.target,\n e: e,\n transform: transform,\n pointer: pointer\n };\n\n if (action === 'rotate') {\n (actionPerformed = this._rotateObject(x, y)) && this._fire('rotating', options);\n }\n else if (action === 'scale') {\n (actionPerformed = this._onScale(e, transform, x, y)) && this._fire('scaling', options);\n }\n else if (action === 'scaleX') {\n (actionPerformed = this._scaleObject(x, y, 'x')) && this._fire('scaling', options);\n }\n else if (action === 'scaleY') {\n (actionPerformed = this._scaleObject(x, y, 'y')) && this._fire('scaling', options);\n }\n else if (action === 'skewX') {\n (actionPerformed = this._skewObject(x, y, 'x')) && this._fire('skewing', options);\n }\n else if (action === 'skewY') {\n (actionPerformed = this._skewObject(x, y, 'y')) && this._fire('skewing', options);\n }\n else {\n actionPerformed = this._translateObject(x, y);\n if (actionPerformed) {\n this._fire('moving', options);\n this.setCursor(options.target.moveCursor || this.moveCursor);\n }\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n },\n\n /**\n * @private\n */\n _fire: function(eventName, options) {\n this.fire('object:' + eventName, options);\n options.target.fire(eventName, options);\n },\n\n /**\n * @private\n */\n _beforeScaleTransform: function(e, transform) {\n if (transform.action === 'scale' || transform.action === 'scaleX' || transform.action === 'scaleY') {\n var centerTransform = this._shouldCenterTransform(transform.target);\n\n // Switch from a normal resize to center-based\n if ((centerTransform && (transform.originX !== 'center' || transform.originY !== 'center')) ||\n // Switch from center-based resize to normal one\n (!centerTransform && transform.originX === 'center' && transform.originY === 'center')\n ) {\n this._resetCurrentTransform();\n transform.reset = true;\n }\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {Object} transform current transform\n * @param {Number} x mouse position x from origin\n * @param {Number} y mouse position y from origin\n * @return {Boolean} true if the scaling occurred\n */\n _onScale: function(e, transform, x, y) {\n if (this._isUniscalePossible(e, transform.target)) {\n transform.currentAction = 'scale';\n return this._scaleObject(x, y);\n }\n else {\n // Switch from a normal resize to proportional\n if (!transform.reset && transform.currentAction === 'scale') {\n this._resetCurrentTransform();\n }\n\n transform.currentAction = 'scaleEqually';\n return this._scaleObject(x, y, 'equally');\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target current target\n * @return {Boolean} true if unproportional scaling is possible\n */\n _isUniscalePossible: function(e, target) {\n return (e[this.uniScaleKey] || this.uniScaleTransform) && !target.get('lockUniScaling');\n },\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent: function (e, target) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return false;\n }\n var hoverCursor = target.hoverCursor || this.hoverCursor,\n activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ?\n this._activeObject : null,\n // only show proper corner when group selection is not active\n corner = (!activeSelection || !activeSelection.contains(target))\n && target._findTargetCorner(this.getPointer(e, true));\n\n if (!corner) {\n this.setCursor(hoverCursor);\n }\n else {\n this.setCursor(this.getCornerCursor(corner, target, e));\n }\n },\n\n /**\n * @private\n */\n getCornerCursor: function(corner, target, e) {\n if (this.actionIsDisabled(corner, target, e)) {\n return this.notAllowedCursor;\n }\n else if (corner in cursorOffset) {\n return this._getRotatedCornerCursor(corner, target, e);\n }\n else if (corner === 'mtr' && target.hasRotatingPoint) {\n return this.rotationCursor;\n }\n else {\n return this.defaultCursor;\n }\n },\n\n actionIsDisabled: function(corner, target, e) {\n if (corner === 'mt' || corner === 'mb') {\n return e[this.altActionKey] ? target.lockSkewingX : target.lockScalingY;\n }\n else if (corner === 'ml' || corner === 'mr') {\n return e[this.altActionKey] ? target.lockSkewingY : target.lockScalingX;\n }\n else if (corner === 'mtr') {\n return target.lockRotation;\n }\n else {\n return this._isUniscalePossible(e, target) ?\n target.lockScalingX && target.lockScalingY : target.lockScalingX || target.lockScalingY;\n }\n },\n\n /**\n * @private\n */\n _getRotatedCornerCursor: function(corner, target, e) {\n var n = Math.round((target.angle % 360) / 45);\n\n if (n < 0) {\n n += 8; // full circle ahead\n }\n n += cursorOffset[corner];\n if (e[this.altActionKey] && cursorOffset[corner] % 2 === 0) {\n //if we are holding shift and we are on a mx corner...\n n += 2;\n }\n // normalize n to be from 0 to 7\n n %= 8;\n\n return this.cursorMap[n];\n }\n });\n})();\n\n\n(function() {\n\n var min = Math.min,\n max = Math.max;\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n * @return {Boolean}\n */\n _shouldGroup: function(e, target) {\n var activeObject = this._activeObject;\n return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&\n (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _handleGrouping: function (e, target) {\n var activeObject = this._activeObject;\n // avoid multi select when shift click on a corner\n if (activeObject.__corner) {\n return;\n }\n if (target === activeObject) {\n // if it's a group, find target again, using activeGroup objects\n target = this.findTarget(e, true);\n // if even object is not found or we are on activeObjectCorner, bail out\n if (!target || !target.selectable) {\n return;\n }\n }\n if (activeObject && activeObject.type === 'activeSelection') {\n this._updateActiveSelection(target, e);\n }\n else {\n this._createActiveSelection(target, e);\n }\n },\n\n /**\n * @private\n */\n _updateActiveSelection: function(target, e) {\n var activeSelection = this._activeObject,\n currentActiveObjects = activeSelection._objects.slice(0);\n if (activeSelection.contains(target)) {\n activeSelection.removeWithUpdate(target);\n this._hoveredTarget = target;\n if (activeSelection.size() === 1) {\n // activate last remaining object\n this._setActiveObject(activeSelection.item(0), e);\n }\n }\n else {\n activeSelection.addWithUpdate(target);\n this._hoveredTarget = activeSelection;\n }\n this._fireSelectionEvents(currentActiveObjects, e);\n },\n\n /**\n * @private\n */\n _createActiveSelection: function(target, e) {\n var currentActives = this.getActiveObjects(), group = this._createGroup(target);\n this._hoveredTarget = group;\n this._setActiveObject(group, e);\n this._fireSelectionEvents(currentActives, e);\n },\n\n /**\n * @private\n * @param {Object} target\n */\n _createGroup: function(target) {\n var objects = this._objects,\n isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target),\n groupObjects = isActiveLower\n ? [this._activeObject, target]\n : [target, this._activeObject];\n this._activeObject.isEditing && this._activeObject.exitEditing();\n return new fabric.ActiveSelection(groupObjects, {\n canvas: this\n });\n },\n\n /**\n * @private\n * @param {Event} e mouse event\n */\n _groupSelectedObjects: function (e) {\n\n var group = this._collectObjects(e),\n aGroup;\n\n // do not create group for 1 element only\n if (group.length === 1) {\n this.setActiveObject(group[0], e);\n }\n else if (group.length > 1) {\n aGroup = new fabric.ActiveSelection(group.reverse(), {\n canvas: this\n });\n this.setActiveObject(aGroup, e);\n }\n },\n\n /**\n * @private\n */\n _collectObjects: function(e) {\n var group = [],\n currentObject,\n x1 = this._groupSelector.ex,\n y1 = this._groupSelector.ey,\n x2 = x1 + this._groupSelector.left,\n y2 = y1 + this._groupSelector.top,\n selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)),\n selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)),\n allowIntersect = !this.selectionFullyContained,\n isClick = x1 === x2 && y1 === y2;\n // we iterate reverse order to collect top first in case of click.\n for (var i = this._objects.length; i--; ) {\n currentObject = this._objects[i];\n\n if (!currentObject || !currentObject.selectable || !currentObject.visible) {\n continue;\n }\n\n if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2)) ||\n currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2) ||\n (allowIntersect && currentObject.containsPoint(selectionX1Y1)) ||\n (allowIntersect && currentObject.containsPoint(selectionX2Y2))\n ) {\n group.push(currentObject);\n // only add one object if it's a click\n if (isClick) {\n break;\n }\n }\n }\n\n if (group.length > 1) {\n group = group.filter(function(object) {\n return !object.onSelect({ e: e });\n });\n }\n\n return group;\n },\n\n /**\n * @private\n */\n _maybeGroupObjects: function(e) {\n if (this.selection && this._groupSelector) {\n this._groupSelectedObjects(e);\n }\n this.setCursor(this.defaultCursor);\n // clear selection and current transformation\n this._groupSelector = null;\n }\n });\n\n})();\n\n\n(function () {\n fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n */\n toDataURL: function (options) {\n options || (options = { });\n\n var format = options.format || 'png',\n quality = options.quality || 1,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1),\n canvasEl = this.toCanvasElement(multiplier, options);\n return fabric.util.toDataURL(canvasEl, format, quality);\n },\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [cropping] Cropping informations\n * @param {Number} [cropping.left] Cropping left offset.\n * @param {Number} [cropping.top] Cropping top offset.\n * @param {Number} [cropping.width] Cropping width.\n * @param {Number} [cropping.height] Cropping height.\n */\n toCanvasElement: function(multiplier, cropping) {\n multiplier = multiplier || 1;\n cropping = cropping || { };\n var scaledWidth = (cropping.width || this.width) * multiplier,\n scaledHeight = (cropping.height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (cropping.left || 0)) * multiplier,\n translateY = (vp[5] - (cropping.top || 0)) * multiplier,\n originalInteractive = this.interactive,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY],\n originalRetina = this.enableRetinaScaling,\n canvasEl = fabric.util.createCanvasElement(),\n originalContextTop = this.contextTop;\n canvasEl.width = scaledWidth;\n canvasEl.height = scaledHeight;\n this.contextTop = null;\n this.enableRetinaScaling = false;\n this.interactive = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d'), this._objects);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.interactive = originalInteractive;\n this.enableRetinaScaling = originalRetina;\n this.contextTop = originalContextTop;\n return canvasEl;\n },\n });\n\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Populates canvas with data from the specified dataless JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toDatalessJSON}\n * @deprecated since 1.2.2\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n */\n loadFromDatalessJSON: function (json, callback, reviver) {\n return this.loadFromJSON(json, callback, reviver);\n },\n\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * });\n */\n loadFromJSON: function (json, callback, reviver) {\n if (!json) {\n return;\n }\n\n // serialize if it wasn't already\n var serialized = (typeof json === 'string')\n ? JSON.parse(json)\n : fabric.util.object.clone(json);\n\n var _this = this,\n clipPath = serialized.clipPath,\n renderOnAddRemove = this.renderOnAddRemove;\n\n this.renderOnAddRemove = false;\n\n delete serialized.clipPath;\n\n this._enlivenObjects(serialized.objects, function (enlivenedObjects) {\n _this.clear();\n _this._setBgOverlay(serialized, function () {\n if (clipPath) {\n _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) {\n _this.clipPath = enlivenedCanvasClip[0];\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n });\n }\n else {\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n }\n });\n }, reviver);\n return this;\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Array} restored canvas objects\n * @param {Function} cached renderOnAddRemove callback\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) {\n var _this = this;\n enlivenedObjects.forEach(function(obj, index) {\n // we splice the array just in case some custom classes restored from JSON\n // will add more object to canvas at canvas init.\n _this.insertAt(obj, index);\n });\n this.renderOnAddRemove = renderOnAddRemove;\n // remove parts i cannot set as options\n delete serialized.objects;\n delete serialized.backgroundImage;\n delete serialized.overlayImage;\n delete serialized.background;\n delete serialized.overlay;\n // this._initOptions does too many things to just\n // call it. Normally loading an Object from JSON\n // create the Object instance. Here the Canvas is\n // already an instance and we are just loading things over it\n this._setOptions(serialized);\n this.renderAll();\n callback && callback();\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n _setBgOverlay: function(serialized, callback) {\n var loaded = {\n backgroundColor: false,\n overlayColor: false,\n backgroundImage: false,\n overlayImage: false\n };\n\n if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) {\n callback && callback();\n return;\n }\n\n var cbIfLoaded = function () {\n if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) {\n callback && callback();\n }\n };\n\n this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded);\n this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded);\n },\n\n /**\n * @private\n * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor)\n * @param {(Object|String)} value Value to set\n * @param {Object} loaded Set loaded property to true if property is set\n * @param {Object} callback Callback function to invoke after property is set\n */\n __setBgOverlay: function(property, value, loaded, callback) {\n var _this = this;\n\n if (!value) {\n loaded[property] = true;\n callback && callback();\n return;\n }\n\n if (property === 'backgroundImage' || property === 'overlayImage') {\n fabric.util.enlivenObjects([value], function(enlivedObject){\n _this[property] = enlivedObject[0];\n loaded[property] = true;\n callback && callback();\n });\n }\n else {\n this['set' + fabric.util.string.capitalize(property, true)](value, function() {\n loaded[property] = true;\n callback && callback();\n });\n }\n },\n\n /**\n * @private\n * @param {Array} objects\n * @param {Function} callback\n * @param {Function} [reviver]\n */\n _enlivenObjects: function (objects, callback, reviver) {\n if (!objects || objects.length === 0) {\n callback && callback([]);\n return;\n }\n\n fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, null, reviver);\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Function} callback\n */\n _toDataURL: function (format, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURL(format));\n });\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Number} multiplier\n * @param {Function} callback\n */\n _toDataURLWithMultiplier: function (format, multiplier, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURLWithMultiplier(format, multiplier));\n });\n },\n\n /**\n * Clones canvas instance\n * @param {Object} [callback] Receives cloned instance as a first argument\n * @param {Array} [properties] Array of properties to include in the cloned canvas and children\n */\n clone: function (callback, properties) {\n var data = JSON.stringify(this.toJSON(properties));\n this.cloneWithoutData(function(clone) {\n clone.loadFromJSON(data, function() {\n callback && callback(clone);\n });\n });\n },\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions, clipping properties, etc.\n * but leaves data empty (so that you can populate it with your own)\n * @param {Object} [callback] Receives cloned instance as a first argument\n */\n cloneWithoutData: function(callback) {\n var el = fabric.util.createCanvasElement();\n\n el.width = this.width;\n el.height = this.height;\n\n var clone = new fabric.Canvas(el);\n clone.clipTo = this.clipTo;\n if (this.backgroundImage) {\n clone.setBackgroundImage(this.backgroundImage.src, function() {\n clone.renderAll();\n callback && callback(clone);\n });\n clone.backgroundImageOpacity = this.backgroundImageOpacity;\n clone.backgroundImageStretch = this.backgroundImageStretch;\n }\n else {\n callback && callback(clone);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n capitalize = fabric.util.string.capitalize,\n degreesToRadians = fabric.util.degreesToRadians,\n supportsLineDash = fabric.StaticCanvas.supports('setLineDash'),\n objectCaching = !fabric.isLikelyNode,\n ALIASING_LIMIT = 2;\n\n if (fabric.Object) {\n return;\n }\n\n /**\n * Root object class from which all 2d shape classes inherit from\n * @class fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n * @see {@link fabric.Object#initialize} for constructor definition\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n * @fires modified\n * @fires modified\n * @fires moved\n * @fires scaled\n * @fires rotated\n * @fires skewed\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\n fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ {\n\n /**\n * Type of an object (rect, circle, path, etc.).\n * Note that this property is meant to be read-only and not meant to be modified.\n * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly.\n * @type String\n * @default\n */\n type: 'object',\n\n /**\n * Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originX: 'left',\n\n /**\n * Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originY: 'top',\n\n /**\n * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n * @type Number\n * @default\n */\n top: 0,\n\n /**\n * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right}\n * @type Number\n * @default\n */\n left: 0,\n\n /**\n * Object width\n * @type Number\n * @default\n */\n width: 0,\n\n /**\n * Object height\n * @type Number\n * @default\n */\n height: 0,\n\n /**\n * Object scale factor (horizontal)\n * @type Number\n * @default\n */\n scaleX: 1,\n\n /**\n * Object scale factor (vertical)\n * @type Number\n * @default\n */\n scaleY: 1,\n\n /**\n * When true, an object is rendered as flipped horizontally\n * @type Boolean\n * @default\n */\n flipX: false,\n\n /**\n * When true, an object is rendered as flipped vertically\n * @type Boolean\n * @default\n */\n flipY: false,\n\n /**\n * Opacity of an object\n * @type Number\n * @default\n */\n opacity: 1,\n\n /**\n * Angle of rotation of an object (in degrees)\n * @type Number\n * @default\n */\n angle: 0,\n\n /**\n * Angle of skew on x axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewX: 0,\n\n /**\n * Angle of skew on y axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewY: 0,\n\n /**\n * Size of object's controlling corners (in pixels)\n * @type Number\n * @default\n */\n cornerSize: 13,\n\n /**\n * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill)\n * @type Boolean\n * @default\n */\n transparentCorners: true,\n\n /**\n * Default cursor value used when hovering over this object on canvas\n * @type String\n * @default\n */\n hoverCursor: null,\n\n /**\n * Default cursor value used when moving this object on canvas\n * @type String\n * @default\n */\n moveCursor: null,\n\n /**\n * Padding between object and its controlling borders (in pixels)\n * @type Number\n * @default\n */\n padding: 0,\n\n /**\n * Color of controlling borders of an object (when it's active)\n * @type String\n * @default\n */\n borderColor: 'rgba(102,153,255,0.75)',\n\n /**\n * Array specifying dash pattern of an object's borders (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n borderDashArray: null,\n\n /**\n * Color of controlling corners of an object (when it's active)\n * @type String\n * @default\n */\n cornerColor: 'rgba(102,153,255,0.5)',\n\n /**\n * Color of controlling corners of an object (when it's active and transparentCorners false)\n * @since 1.6.2\n * @type String\n * @default\n */\n cornerStrokeColor: null,\n\n /**\n * Specify style of control, 'rect' or 'circle'\n * @since 1.6.2\n * @type String\n */\n cornerStyle: 'rect',\n\n /**\n * Array specifying dash pattern of an object's control (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n cornerDashArray: null,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being scaled via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being rotated via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: true,\n\n /**\n * Color of object's fill\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n fill: 'rgb(0,0,0)',\n\n /**\n * Fill rule used to fill an object\n * accepted values are nonzero, evenodd\n * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead)\n * @type String\n * @default\n */\n fillRule: 'nonzero',\n\n /**\n * Composite rule used for canvas globalCompositeOperation\n * @type String\n * @default\n */\n globalCompositeOperation: 'source-over',\n\n /**\n * Background color of an object.\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n backgroundColor: '',\n\n /**\n * Selection Background color of an object. colored layer behind the object when it is active.\n * does not mix good with globalCompositeOperation methods.\n * @type String\n * @default\n */\n selectionBackgroundColor: '',\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Width of a stroke used to render this object\n * @type Number\n * @default\n */\n strokeWidth: 1,\n\n /**\n * Array specifying dash pattern of an object's stroke (stroke must be defined)\n * @type Array\n */\n strokeDashArray: null,\n\n /**\n * Line offset of an object's stroke\n * @type Number\n * @default\n */\n strokeDashOffset: 0,\n\n /**\n * Line endings style of an object's stroke (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'butt',\n\n /**\n * Corner style of an object's stroke (one of \"bevil\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'miter',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of an object's stroke\n * @type Number\n * @default\n */\n strokeMiterLimit: 4,\n\n /**\n * Shadow object representing shadow of this shape\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Opacity of object's controlling borders when object is active and moving\n * @type Number\n * @default\n */\n borderOpacityWhenMoving: 0.4,\n\n /**\n * Scale factor of object's controlling borders\n * @type Number\n * @default\n */\n borderScaleFactor: 1,\n\n /**\n * Transform matrix (similar to SVG's transform matrix)\n * This property has been depreacted. Since caching and and qrDecompose this\n * property can be handled with the standard top,left,scaleX,scaleY,angle and skewX.\n * A documentation example on how to parse and merge a transformMatrix will be provided before\n * completely removing it in fabric 4.0\n * If you are starting a project now, DO NOT use it.\n * @deprecated since 3.2.0\n * @type Array\n */\n transformMatrix: null,\n\n /**\n * Minimum allowed scale value of an object\n * @type Number\n * @default\n */\n minScaleLimit: 0,\n\n /**\n * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection).\n * But events still fire on it.\n * @type Boolean\n * @default\n */\n selectable: true,\n\n /**\n * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4\n * @type Boolean\n * @default\n */\n evented: true,\n\n /**\n * When set to `false`, an object is not rendered on canvas\n * @type Boolean\n * @default\n */\n visible: true,\n\n /**\n * When set to `false`, object's controls are not displayed and can not be used to manipulate object\n * @type Boolean\n * @default\n */\n hasControls: true,\n\n /**\n * When set to `false`, object's controlling borders are not rendered\n * @type Boolean\n * @default\n */\n hasBorders: true,\n\n /**\n * When set to `false`, object's controlling rotating point will not be visible or selectable\n * @type Boolean\n * @default\n */\n hasRotatingPoint: true,\n\n /**\n * Offset for object's controlling rotating point (when enabled via `hasRotatingPoint`)\n * @type Number\n * @default\n */\n rotatingPointOffset: 40,\n\n /**\n * When set to `true`, objects are \"found\" on canvas on per-pixel basis rather than according to bounding box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * When `false`, default object's values are not included in its serialization\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * Function that determines clipping of an object (context is passed as a first argument).\n * If you are using code minification, ctx argument can be minified/manglied you should use\n * as a workaround `var ctx = arguments[0];` in the function;\n * Note that context origin is at the object's center point (not left/top corner)\n * @deprecated since 2.0.0\n * @type Function\n */\n clipTo: null,\n\n /**\n * When `true`, object horizontal movement is locked\n * @type Boolean\n * @default\n */\n lockMovementX: false,\n\n /**\n * When `true`, object vertical movement is locked\n * @type Boolean\n * @default\n */\n lockMovementY: false,\n\n /**\n * When `true`, object rotation is locked\n * @type Boolean\n * @default\n */\n lockRotation: false,\n\n /**\n * When `true`, object horizontal scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingX: false,\n\n /**\n * When `true`, object vertical scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingY: false,\n\n /**\n * When `true`, object non-uniform scaling is locked\n * @type Boolean\n * @default\n */\n lockUniScaling: false,\n\n /**\n * When `true`, object horizontal skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingX: false,\n\n /**\n * When `true`, object vertical skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingY: false,\n\n /**\n * When `true`, object cannot be flipped by scaling into negative values\n * @type Boolean\n * @default\n */\n lockScalingFlip: false,\n\n /**\n * When `true`, object is not exported in OBJECT/JSON\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n excludeFromExport: false,\n\n /**\n * When `true`, object is cached on an additional canvas.\n * When `false`, object is not cached unless necessary ( clipPath )\n * default to true\n * @since 1.7.0\n * @type Boolean\n * @default true\n */\n objectCaching: objectCaching,\n\n /**\n * When `true`, object properties are checked for cache invalidation. In some particular\n * situation you may want this to be disabled ( spray brush, very big, groups)\n * or if your application does not allow you to modify properties for groups child you want\n * to disable it for groups.\n * default to false\n * since 1.7.0\n * @type Boolean\n * @default false\n */\n statefullCache: false,\n\n /**\n * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled\n * too much and will be redrawn with correct details at the end of scaling.\n * this setting is performance and application dependant.\n * default to true\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n noScaleCache: true,\n\n /**\n * When `false`, the stoke width will scale with the object.\n * When `true`, the stroke will always match the exact pixel size entered for stroke width.\n * default to false\n * @since 2.6.0\n * @type Boolean\n * @default false\n * @type Boolean\n * @default false\n */\n strokeUniform: false,\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n dirty: true,\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * @type number|string|any\n * @default 0\n */\n __corner: 0,\n\n /**\n * Determines if the fill or the stroke is drawn first (one of \"fill\" or \"stroke\")\n * @type String\n * @default\n */\n paintFirst: 'fill',\n\n /**\n * List of properties to consider when checking if state\n * of an object is changed (fabric.Object#hasStateChanged)\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: (\n 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +\n 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +\n 'angle opacity fill globalCompositeOperation shadow clipTo visible backgroundColor ' +\n 'skewX skewY fillRule paintFirst clipPath strokeUniform'\n ).split(' '),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: (\n 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' +\n ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'\n ).split(' '),\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the object has rendered, and the context is placed in the center\n * of the object cacheCanvas.\n * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center'\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will make the object clip to the outside of the clipPath\n * since 2.4.0\n * @type boolean\n * @default false\n */\n inverted: false,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will have its top and left relative to canvas, and will\n * not be influenced by the object transform. This will make the clipPath relative\n * to the canvas, but clipping just a particular object.\n * WARNING this is beta, this feature may change or be renamed.\n * since 2.4.0\n * @type boolean\n * @default false\n */\n absolutePositioned: false,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas: function() {\n this._cacheProperties = {};\n this._cacheCanvas = fabric.util.createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n },\n\n /**\n * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * @param {Object} dims\n * @param {Object} dims.width width of canvas\n * @param {Object} dims.height height of canvas\n * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _limitCacheSize: function(dims) {\n var perfLimitSizeTotal = fabric.perfLimitSizeTotal,\n width = dims.width, height = dims.height,\n max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit;\n if (width <= max && height <= max && width * height <= perfLimitSizeTotal) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal),\n capValue = fabric.util.capValue,\n x = capValue(min, limitedDims.x, max),\n y = capValue(min, limitedDims.y, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {Object}.x width of object to be cached\n * @return {Object}.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var objectScale = this.getTotalObjectScaling(),\n // caculate dimensions without skewing\n dim = this._getTransformedDimensions(0, 0),\n neededX = dim.x * objectScale.scaleX / this.scaleX,\n neededY = dim.y * objectScale.scaleY / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: neededX + ALIASING_LIMIT,\n height: neededY + ALIASING_LIMIT,\n zoomX: objectScale.scaleX,\n zoomY: objectScale.scaleY,\n x: neededX,\n y: neededY\n };\n },\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas: function() {\n var targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n var target = targetCanvas._currentTransform.target,\n action = targetCanvas._currentTransform.action;\n if (this === target && action.slice && action.slice(0, 5) === 'scale') {\n return false;\n }\n }\n var canvas = this._cacheCanvas,\n dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n minCacheSize = fabric.minCacheSideLimit,\n width = dims.width, height = dims.height, drawingWidth, drawingHeight,\n zoomX = dims.zoomX, zoomY = dims.zoomY,\n dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY,\n shouldRedraw = dimensionsChanged || zoomChanged,\n additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false;\n if (dimensionsChanged) {\n var canvasWidth = this._cacheCanvas.width,\n canvasHeight = this._cacheCanvas.height,\n sizeGrowing = width > canvasWidth || height > canvasHeight,\n sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&\n canvasWidth > minCacheSize && canvasHeight > minCacheSize;\n shouldResizeCanvas = sizeGrowing || sizeShrinking;\n if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) {\n additionalWidth = width * 0.1;\n additionalHeight = height * 0.1;\n }\n }\n if (shouldRedraw) {\n if (shouldResizeCanvas) {\n canvas.width = Math.ceil(width + additionalWidth);\n canvas.height = Math.ceil(height + additionalHeight);\n }\n else {\n this._cacheContext.setTransform(1, 0, 0, 1, 0, 0);\n this._cacheContext.clearRect(0, 0, canvas.width, canvas.height);\n }\n drawingWidth = dims.x / 2;\n drawingHeight = dims.y / 2;\n this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n this.cacheWidth = width;\n this.cacheHeight = height;\n this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY);\n this._cacheContext.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n },\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n this._setOptions(options);\n this._initGradient(options.fill, 'fill');\n this._initGradient(options.stroke, 'stroke');\n this._initClipping(options);\n this._initPattern(options.fill, 'fill');\n this._initPattern(options.stroke, 'stroke');\n },\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform: function(ctx) {\n var m;\n if (this.group && !this.group._transformDone) {\n m = this.calcTransformMatrix();\n }\n else {\n m = this.calcOwnMatrix();\n }\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n },\n\n /**\n * Returns an object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n\n object = {\n type: this.type,\n version: fabric.version,\n originX: this.originX,\n originY: this.originY,\n left: toFixed(this.left, NUM_FRACTION_DIGITS),\n top: toFixed(this.top, NUM_FRACTION_DIGITS),\n width: toFixed(this.width, NUM_FRACTION_DIGITS),\n height: toFixed(this.height, NUM_FRACTION_DIGITS),\n fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill,\n stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke,\n strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),\n strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,\n strokeLineCap: this.strokeLineCap,\n strokeDashOffset: this.strokeDashOffset,\n strokeLineJoin: this.strokeLineJoin,\n strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),\n scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS),\n scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS),\n angle: toFixed(this.angle, NUM_FRACTION_DIGITS),\n flipX: this.flipX,\n flipY: this.flipY,\n opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS),\n shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow,\n visible: this.visible,\n clipTo: this.clipTo && String(this.clipTo),\n backgroundColor: this.backgroundColor,\n fillRule: this.fillRule,\n paintFirst: this.paintFirst,\n globalCompositeOperation: this.globalCompositeOperation,\n transformMatrix: this.transformMatrix ? this.transformMatrix.concat() : null,\n skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS),\n skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS),\n };\n\n if (this.clipPath) {\n object.clipPath = this.clipPath.toObject(propertiesToInclude);\n object.clipPath.inverted = this.clipPath.inverted;\n object.clipPath.absolutePositioned = this.clipPath.absolutePositioned;\n }\n\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n if (!this.includeDefaultValues) {\n object = this._removeDefaultValues(object);\n }\n\n return object;\n },\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues: function(object) {\n var prototype = fabric.util.getKlass(object.type).prototype,\n stateProperties = prototype.stateProperties;\n stateProperties.forEach(function(prop) {\n if (prop === 'left' || prop === 'top') {\n return;\n }\n if (object[prop] === prototype[prop]) {\n delete object[prop];\n }\n var isArray = Object.prototype.toString.call(object[prop]) === '[object Array]' &&\n Object.prototype.toString.call(prototype[prop]) === '[object Array]';\n\n // basically a check for [] === []\n if (isArray && object[prop].length === 0 && prototype[prop].length === 0) {\n delete object[prop];\n }\n });\n\n return object;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Object} object with scaleX and scaleY properties\n */\n getObjectScaling: function() {\n var scaleX = this.scaleX, scaleY = this.scaleY;\n if (this.group) {\n var scaling = this.group.getObjectScaling();\n scaleX *= scaling.scaleX;\n scaleY *= scaling.scaleY;\n }\n return { scaleX: scaleX, scaleY: scaleY };\n },\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling: function() {\n var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY;\n if (this.canvas) {\n var zoom = this.canvas.getZoom();\n var retina = this.canvas.getRetinaScaling();\n scaleX *= zoom * retina;\n scaleY *= zoom * retina;\n }\n return { scaleX: scaleX, scaleY: scaleY };\n },\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity: function() {\n var opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Object} thisArg\n */\n _set: function(key, value) {\n var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'),\n isChanged = this[key] !== value, groupNeedsUpdate = false;\n\n if (shouldConstrainValue) {\n value = this._constrainScale(value);\n }\n if (key === 'scaleX' && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n }\n else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n }\n else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) {\n value = new fabric.Shadow(value);\n }\n else if (key === 'dirty' && this.group) {\n this.group.set('dirty', value);\n }\n\n this[key] = value;\n\n if (isChanged) {\n groupNeedsUpdate = this.group && this.group.isOnACache();\n if (this.cacheProperties.indexOf(key) > -1) {\n this.dirty = true;\n groupNeedsUpdate && this.group.set('dirty', true);\n }\n else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) {\n this.group.set('dirty', true);\n }\n }\n\n return this;\n },\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup: function() {\n // implemented by sub-classes, as needed.\n },\n\n /**\n * Retrieves viewportTransform from Object's canvas if possible\n * @method getViewportTransform\n * @memberOf fabric.Object.prototype\n * @return {Array}\n */\n getViewportTransform: function() {\n if (this.canvas && this.canvas.viewportTransform) {\n return this.canvas.viewportTransform;\n }\n return fabric.iMatrix.concat();\n },\n\n /*\n * @private\n * return if the object would be visible in rendering\n * @memberOf fabric.Object.prototype\n * @return {Boolean}\n */\n isNotVisible: function() {\n return this.opacity === 0 ||\n (this.width === 0 && this.height === 0 && this.strokeWidth === 0) ||\n !this.visible;\n },\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx, this);\n if (this.transformMatrix) {\n ctx.transform.apply(ctx, this.transformMatrix);\n }\n this.clipTo && fabric.util.clipContext(this, ctx);\n if (this.shouldCache()) {\n this.renderCache();\n this.drawCacheOnCanvas(ctx);\n }\n else {\n this._removeCacheCanvas();\n this.dirty = false;\n this.drawObject(ctx);\n if (this.objectCaching && this.statefullCache) {\n this.saveState({ propertySet: 'cacheProperties' });\n }\n }\n this.clipTo && ctx.restore();\n ctx.restore();\n },\n\n renderCache: function(options) {\n options = options || {};\n if (!this._cacheCanvas) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty()) {\n this.statefullCache && this.saveState({ propertySet: 'cacheProperties' });\n this.drawObject(this._cacheContext, options.forClipping);\n this.dirty = false;\n }\n },\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas: function() {\n this._cacheCanvas = null;\n this.cacheWidth = 0;\n this.cacheHeight = 0;\n },\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an aproximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke: function() {\n return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0;\n },\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an aproximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill: function() {\n return this.fill && this.fill !== 'transparent';\n },\n\n /**\n * When set to `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache: function() {\n if (this.paintFirst === 'stroke' &&\n this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache: function() {\n this.ownCaching = this.needsItsOwnCache() || (\n this.objectCaching &&\n (!this.group || !this.group.isOnACache())\n );\n return this.ownCaching;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n */\n willDrawShadow: function() {\n return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0);\n },\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCache: function(ctx) {\n var path = this.clipPath;\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (path.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n }\n else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n //ctx.scale(1 / 2, 1 / 2);\n if (path.absolutePositioned) {\n var m = fabric.util.invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n path.transform(ctx);\n ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx, forClipping) {\n var originalFill = this.fill, originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n }\n else {\n this._renderBackground(ctx);\n this._setStrokeStyles(ctx, this);\n this._setFillStyles(ctx, this);\n }\n this._render(ctx);\n this._drawClipPath(ctx);\n this.fill = originalFill;\n this.stroke = originalStroke;\n },\n\n _drawClipPath: function(ctx) {\n var path = this.clipPath;\n if (!path) { return; }\n // needed to setup a couple of variables\n // path canvas gets overridden with this one.\n // TODO find a better solution?\n path.canvas = this.canvas;\n path.shouldCache();\n path._transformDone = true;\n path.renderCache({ forClipping: true });\n this.drawClipPathOnCache(ctx);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY);\n },\n\n /**\n * Check if cache is dirty\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty: function(skipCanvas) {\n if (this.isNotVisible()) {\n return false;\n }\n if (this._cacheCanvas && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n }\n else {\n if (this.dirty ||\n (this.clipPath && this.clipPath.absolutePositioned) ||\n (this.statefullCache && this.hasStateChanged('cacheProperties'))\n ) {\n if (this._cacheCanvas && !skipCanvas) {\n var width = this.cacheWidth / this.zoomX;\n var height = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-width / 2, -height / 2, width, height);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n if (!this.backgroundColor) {\n return;\n }\n var dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(\n -dim.x / 2,\n -dim.y / 2,\n dim.x,\n dim.y\n );\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity: function(ctx) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n }\n else {\n ctx.globalAlpha *= this.opacity;\n }\n },\n\n _setStrokeStyles: function(ctx, decl) {\n if (decl.stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n ctx.strokeStyle = decl.stroke.toLive\n ? decl.stroke.toLive(ctx, this)\n : decl.stroke;\n }\n },\n\n _setFillStyles: function(ctx, decl) {\n if (decl.fill) {\n ctx.fillStyle = decl.fill.toLive\n ? decl.fill.toLive(ctx, this)\n : decl.fill;\n }\n },\n\n _setClippingProperties: function(ctx) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n },\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n * @param {Function} alternative function to call if browser does not support lineDash\n */\n _setLineDash: function(ctx, dashArray, alternative) {\n if (!dashArray) {\n return;\n }\n // Spec requires the concatenation of two copies the dash list when the number of elements is odd\n if (1 & dashArray.length) {\n dashArray.push.apply(dashArray, dashArray);\n }\n if (supportsLineDash) {\n ctx.setLineDash(dashArray);\n }\n else {\n alternative && alternative(ctx);\n }\n if (this.strokeUniform) {\n ctx.setLineDash(ctx.getLineDash().map(function(value) { return value * ctx.lineWidth; }));\n }\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n */\n _renderControls: function(ctx, styleOverride) {\n var vpt = this.getViewportTransform(),\n matrix = this.calcTransformMatrix(),\n options, drawBorders, drawControls;\n styleOverride = styleOverride || { };\n drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders;\n drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls;\n matrix = fabric.util.multiplyTransformMatrices(vpt, matrix);\n options = fabric.util.qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = 1 * this.borderScaleFactor;\n if (!this.group) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (styleOverride.forActiveSelection) {\n ctx.rotate(degreesToRadians(options.angle));\n drawBorders && this.drawBordersInGroup(ctx, options, styleOverride);\n }\n else {\n ctx.rotate(degreesToRadians(this.angle));\n drawBorders && this.drawBorders(ctx, styleOverride);\n }\n drawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n var shadow = this.shadow, canvas = this.canvas, scaling,\n multX = (canvas && canvas.viewportTransform[0]) || 1,\n multY = (canvas && canvas.viewportTransform[3]) || 1;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n if (canvas && canvas._isRetinaScaling()) {\n multX *= fabric.devicePixelRatio;\n multY *= fabric.devicePixelRatio;\n }\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant *\n (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} filler fabric.Pattern or fabric.Gradient\n * @return {Object} offset.offsetX offset for text rendering\n * @return {Object} offset.offsetY offset for text rendering\n */\n _applyPatternGradientTransform: function(ctx, filler) {\n if (!filler || !filler.toLive) {\n return { offsetX: 0, offsetY: 0 };\n }\n var t = filler.gradientTransform || filler.patternTransform;\n var offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if (filler.gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n }\n else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n }\n else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n },\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(/* ctx */) {\n\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill: function(ctx) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._applyPatternGradientTransform(ctx, this.fill);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n }\n else {\n ctx.fill();\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform) {\n ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n }\n this._setLineDash(ctx, this.strokeDashArray, this._renderDashedStroke);\n if (this.stroke.toLive && this.stroke.gradientUnits === 'percentage') {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, this.stroke);\n }\n else {\n this._applyPatternGradientTransform(ctx, this.stroke);\n }\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Gradient} filler a fabric gradient instance\n */\n _applyPatternForTransformedGradient: function(ctx, filler) {\n var dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx);\n pCtx.fill();\n ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2);\n ctx.scale(\n retinaScaling * this.scaleX / dims.zoomX,\n retinaScaling * this.scaleY / dims.zoomY\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return { x: this.left + this.width / 2, y: this.top + this.height / 2 };\n },\n\n /**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n * @chainable\n */\n _assignTransformMatrixProps: function() {\n if (this.transformMatrix) {\n var options = fabric.util.qrDecompose(this.transformMatrix);\n this.flipX = false;\n this.flipY = false;\n this.set('scaleX', options.scaleX);\n this.set('scaleY', options.scaleY);\n this.angle = options.angle;\n this.skewX = options.skewX;\n this.skewY = 0;\n }\n },\n\n /**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n * @return {thisArg}\n */\n _removeTransformMatrix: function(preserveAspectRatioOptions) {\n var center = this._findCenterFromElement();\n if (this.transformMatrix) {\n this._assignTransformMatrixProps();\n center = fabric.util.transformPoint(center, this.transformMatrix);\n }\n this.transformMatrix = null;\n if (preserveAspectRatioOptions) {\n this.scaleX *= preserveAspectRatioOptions.scaleX;\n this.scaleY *= preserveAspectRatioOptions.scaleY;\n this.cropX = preserveAspectRatioOptions.cropX;\n this.cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n this.width = preserveAspectRatioOptions.width;\n this.height = preserveAspectRatioOptions.height;\n }\n this.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * Clones an instance, using a callback method will work for every object.\n * @param {Function} callback Callback is invoked with a clone as a first argument\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n */\n clone: function(callback, propertiesToInclude) {\n var objectForm = this.toObject(propertiesToInclude);\n if (this.constructor.fromObject) {\n this.constructor.fromObject(objectForm, callback);\n }\n else {\n fabric.Object._fromObject('Object', objectForm, callback);\n }\n },\n\n /**\n * Creates an instance of fabric.Image out of an object\n * could make use of both toDataUrl or toCanvasElement.\n * @param {Function} callback callback, invoked with an instance as a first argument\n * @param {Object} [options] for clone as image, passed to toDataURL\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {fabric.Object} thisArg\n */\n cloneAsImage: function(callback, options) {\n var canvasEl = this.toCanvasElement(options);\n if (callback) {\n callback(new fabric.Image(canvasEl));\n }\n return this;\n },\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {Object} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toCanvasElement: function(options) {\n options || (options = { });\n\n var utils = fabric.util, origParams = utils.saveObjectTransform(this),\n originalShadow = this.shadow, abs = Math.abs,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1);\n\n if (options.withoutTransform) {\n utils.resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n\n var el = fabric.util.createCanvasElement(),\n // skip canvas zoom and calculate with setCoords now.\n boundingRect = this.getBoundingRect(true, true),\n shadow = this.shadow, scaling,\n shadowOffset = { x: 0, y: 0 }, shadowBlur;\n\n if (shadow) {\n shadowBlur = shadow.blur;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX));\n shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY));\n }\n el.width = boundingRect.width + shadowOffset.x;\n el.height = boundingRect.height + shadowOffset.y;\n el.width += el.width % 2 ? 2 - el.width % 2 : 0;\n el.height += el.height % 2 ? 2 - el.height % 2 : 0;\n var canvas = new fabric.StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n });\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center');\n\n var originalCanvas = this.canvas;\n canvas.add(this);\n var canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.shadow = originalShadow;\n this.canvas = originalCanvas;\n this.set(origParams).setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n canvas.dispose();\n canvas = null;\n\n return canvasEl;\n },\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL: function(options) {\n options || (options = { });\n return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1);\n },\n\n /**\n * Returns true if specified type is identical to the type of an instance\n * @param {String} type Type to check against\n * @return {Boolean}\n */\n isType: function(type) {\n return this.type === type;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity: function() {\n return 1;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON\n */\n toJSON: function(propertiesToInclude) {\n // delegate, not alias\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * Sets gradient (fill or stroke) of an object\n * percentages for x1,x2,y1,y2,r1,r2 together with gradientUnits 'pixels', are not supported.\n * Backwards incompatibility note: This method was named \"setGradientFill\" until v1.1.0\n * @param {String} property Property name 'stroke' or 'fill'\n * @param {Object} [options] Options object\n * @param {String} [options.type] Type of gradient 'radial' or 'linear'\n * @param {Number} [options.x1=0] x-coordinate of start point\n * @param {Number} [options.y1=0] y-coordinate of start point\n * @param {Number} [options.x2=0] x-coordinate of end point\n * @param {Number} [options.y2=0] y-coordinate of end point\n * @param {Number} [options.r1=0] Radius of start point (only for radial gradients)\n * @param {Number} [options.r2=0] Radius of end point (only for radial gradients)\n * @param {Object} [options.colorStops] Color stops object eg. {0: 'ff0000', 1: '000000'}\n * @param {Object} [options.gradientTransform] transformMatrix for gradient\n * @return {fabric.Object} thisArg\n * @chainable\n * @deprecated since 3.4.0\n * @see {@link http://jsfiddle.net/fabricjs/58y8b/|jsFiddle demo}\n * @example Set linear gradient\n * object.setGradient('fill', {\n * type: 'linear',\n * x1: -object.width / 2,\n * y1: 0,\n * x2: object.width / 2,\n * y2: 0,\n * colorStops: {\n * 0: 'red',\n * 0.5: '#005555',\n * 1: 'rgba(0,0,255,0.5)'\n * }\n * });\n * canvas.renderAll();\n * @example Set radial gradient\n * object.setGradient('fill', {\n * type: 'radial',\n * x1: 0,\n * y1: 0,\n * x2: 0,\n * y2: 0,\n * r1: object.width / 2,\n * r2: 10,\n * colorStops: {\n * 0: 'red',\n * 0.5: '#005555',\n * 1: 'rgba(0,0,255,0.5)'\n * }\n * });\n * canvas.renderAll();\n */\n setGradient: function(property, options) {\n options || (options = { });\n\n var gradient = { colorStops: [] };\n\n gradient.type = options.type || (options.r1 || options.r2 ? 'radial' : 'linear');\n gradient.coords = {\n x1: options.x1,\n y1: options.y1,\n x2: options.x2,\n y2: options.y2\n };\n gradient.gradientUnits = options.gradientUnits || 'pixels';\n if (options.r1 || options.r2) {\n gradient.coords.r1 = options.r1;\n gradient.coords.r2 = options.r2;\n }\n\n gradient.gradientTransform = options.gradientTransform;\n fabric.Gradient.prototype.addColorStop.call(gradient, options.colorStops);\n\n return this.set(property, fabric.Gradient.forObject(this, gradient));\n },\n\n /**\n * Sets pattern fill of an object\n * @param {Object} options Options object\n * @param {(String|HTMLImageElement)} options.source Pattern source\n * @param {String} [options.repeat=repeat] Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n * @param {Number} [options.offsetX=0] Pattern horizontal offset from object's left/top corner\n * @param {Number} [options.offsetY=0] Pattern vertical offset from object's left/top corner\n * @param {Function} [callback] Callback to invoke when image set as a pattern\n * @return {fabric.Object} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/QT3pa/|jsFiddle demo}\n * @example Set pattern\n * object.setPatternFill({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat'\n * },canvas.renderAll.bind(canvas));\n */\n setPatternFill: function(options, callback) {\n return this.set('fill', new fabric.Pattern(options, callback));\n },\n\n /**\n * Sets {@link fabric.Object#shadow|shadow} of an object\n * @param {Object|String} [options] Options object or string (e.g. \"2px 2px 10px rgba(0,0,0,0.2)\")\n * @param {String} [options.color=rgb(0,0,0)] Shadow color\n * @param {Number} [options.blur=0] Shadow blur\n * @param {Number} [options.offsetX=0] Shadow horizontal offset\n * @param {Number} [options.offsetY=0] Shadow vertical offset\n * @return {fabric.Object} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/7gvJG/|jsFiddle demo}\n * @example Set shadow with string notation\n * object.setShadow('2px 2px 10px rgba(0,0,0,0.2)');\n * canvas.renderAll();\n * @example Set shadow with object notation\n * object.setShadow({\n * color: 'red',\n * blur: 10,\n * offsetX: 20,\n * offsetY: 20\n * });\n * canvas.renderAll();\n */\n setShadow: function(options) {\n return this.set('shadow', options ? new fabric.Shadow(options) : null);\n },\n\n /**\n * Sets \"color\" of an instance (alias of `set('fill', …)`)\n * @param {String} color Color value\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setColor: function(color) {\n this.set('fill', color);\n return this;\n },\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {Number} angle Angle value (in degrees)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n rotate: function(angle) {\n var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation;\n\n if (shouldCenterOrigin) {\n this._setOriginToCenter();\n }\n\n this.set('angle', angle);\n\n if (shouldCenterOrigin) {\n this._resetOrigin();\n }\n\n return this;\n },\n\n /**\n * Centers object horizontally on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerH: function () {\n this.canvas && this.canvas.centerObjectH(this);\n return this;\n },\n\n /**\n * Centers object horizontally on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterH: function () {\n this.canvas && this.canvas.viewportCenterObjectH(this);\n return this;\n },\n\n /**\n * Centers object vertically on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerV: function () {\n this.canvas && this.canvas.centerObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterV: function () {\n this.canvas && this.canvas.viewportCenterObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically and horizontally on canvas to which is was added last\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n center: function () {\n this.canvas && this.canvas.centerObject(this);\n return this;\n },\n\n /**\n * Centers object on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenter: function () {\n this.canvas && this.canvas.viewportCenterObject(this);\n return this;\n },\n\n /**\n * Returns coordinates of a pointer relative to an object\n * @param {Event} e Event to operate upon\n * @param {Object} [pointer] Pointer to operate upon (instead of event)\n * @return {Object} Coordinates of a pointer (x, y)\n */\n getLocalPointer: function(e, pointer) {\n pointer = pointer || this.canvas.getPointer(e);\n var pClicked = new fabric.Point(pointer.x, pointer.y),\n objectLeftTop = this._getLeftTopCoords();\n if (this.angle) {\n pClicked = fabric.util.rotatePoint(\n pClicked, objectLeftTop, degreesToRadians(-this.angle));\n }\n return {\n x: pClicked.x - objectLeftTop.x,\n y: pClicked.y - objectLeftTop.y\n };\n },\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation: function (ctx) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n }\n });\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object);\n\n extend(fabric.Object.prototype, fabric.Observable);\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type Number\n */\n fabric.Object.NUM_FRACTION_DIGITS = 2;\n\n fabric.Object._fromObject = function(className, object, callback, extraParam) {\n var klass = fabric[className];\n object = clone(object, true);\n fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) {\n if (typeof patterns[0] !== 'undefined') {\n object.fill = patterns[0];\n }\n if (typeof patterns[1] !== 'undefined') {\n object.stroke = patterns[1];\n }\n fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) {\n object.clipPath = enlivedProps[0];\n var instance = extraParam ? new klass(object[extraParam], object) : new klass(object);\n callback && callback(instance);\n });\n });\n };\n\n /**\n * Unique id used internally when creating SVG elements\n * @static\n * @memberOf fabric.Object\n * @type Number\n */\n fabric.Object.__uid = 0;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians,\n originXOffset = {\n left: -0.5,\n center: 0,\n right: 0.5\n },\n originYOffset = {\n top: -0.5,\n center: 0,\n bottom: 0.5\n };\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) {\n var x = point.x,\n y = point.y,\n offsetX, offsetY, dim;\n\n if (typeof fromOriginX === 'string') {\n fromOriginX = originXOffset[fromOriginX];\n }\n else {\n fromOriginX -= 0.5;\n }\n\n if (typeof toOriginX === 'string') {\n toOriginX = originXOffset[toOriginX];\n }\n else {\n toOriginX -= 0.5;\n }\n\n offsetX = toOriginX - fromOriginX;\n\n if (typeof fromOriginY === 'string') {\n fromOriginY = originYOffset[fromOriginY];\n }\n else {\n fromOriginY -= 0.5;\n }\n\n if (typeof toOriginY === 'string') {\n toOriginY = originYOffset[toOriginY];\n }\n else {\n toOriginY -= 0.5;\n }\n\n offsetY = toOriginY - fromOriginY;\n\n if (offsetX || offsetY) {\n dim = this._getTransformedDimensions();\n x = point.x + offsetX * dim.x;\n y = point.y + offsetY * dim.y;\n }\n\n return new fabric.Point(x, y);\n },\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToCenterPoint: function(point, originX, originY) {\n var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center');\n if (this.angle) {\n return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {fabric.Point} center The point which corresponds to center of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToOriginPoint: function(center, originX, originY) {\n var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n if (this.angle) {\n return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Returns the real center coordinates of the object\n * @return {fabric.Point}\n */\n getCenterPoint: function() {\n var leftTop = new fabric.Point(this.left, this.top);\n return this.translateToCenterPoint(leftTop, this.originX, this.originY);\n },\n\n /**\n * Returns the coordinates of the object based on center coordinates\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @return {fabric.Point}\n */\n // getOriginPoint: function(center) {\n // return this.translateToOriginPoint(center, this.originX, this.originY);\n // },\n\n /**\n * Returns the coordinates of the object as if it has a different origin\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n getPointByOrigin: function(originX, originY) {\n var center = this.getCenterPoint();\n return this.translateToOriginPoint(center, originX, originY);\n },\n\n /**\n * Returns the point in local coordinates\n * @param {fabric.Point} point The point relative to the global coordinate system\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n toLocalPoint: function(point, originX, originY) {\n var center = this.getCenterPoint(),\n p, p2;\n\n if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) {\n p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n }\n else {\n p = new fabric.Point(this.left, this.top);\n }\n\n p2 = new fabric.Point(point.x, point.y);\n if (this.angle) {\n p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle));\n }\n return p2.subtractEquals(p);\n },\n\n /**\n * Returns the point in global coordinates\n * @param {fabric.Point} The point relative to the local coordinate system\n * @return {fabric.Point}\n */\n // toGlobalPoint: function(point) {\n // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top));\n // },\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {fabric.Point} pos The new position of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin: function(pos, originX, originY) {\n var center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(center, this.originX, this.originY);\n this.set('left', position.x);\n this.set('top', position.y);\n },\n\n /**\n * @param {String} to One of 'left', 'center', 'right'\n */\n adjustPosition: function(to) {\n var angle = degreesToRadians(this.angle),\n hypotFull = this.getScaledWidth(),\n xFull = fabric.util.cos(angle) * hypotFull,\n yFull = fabric.util.sin(angle) * hypotFull,\n offsetFrom, offsetTo;\n\n //TODO: this function does not consider mixed situation like top, center.\n if (typeof this.originX === 'string') {\n offsetFrom = originXOffset[this.originX];\n }\n else {\n offsetFrom = this.originX - 0.5;\n }\n if (typeof to === 'string') {\n offsetTo = originXOffset[to];\n }\n else {\n offsetTo = to - 0.5;\n }\n this.left += xFull * (offsetTo - offsetFrom);\n this.top += yFull * (offsetTo - offsetFrom);\n this.setCoords();\n this.originX = to;\n },\n\n /**\n * Sets the origin/position of the object to it's center point\n * @private\n * @return {void}\n */\n _setOriginToCenter: function() {\n this._originalOriginX = this.originX;\n this._originalOriginY = this.originY;\n\n var center = this.getCenterPoint();\n\n this.originX = 'center';\n this.originY = 'center';\n\n this.left = center.x;\n this.top = center.y;\n },\n\n /**\n * Resets the origin/position of the object to it's original origin\n * @private\n * @return {void}\n */\n _resetOrigin: function() {\n var originPoint = this.translateToOriginPoint(\n this.getCenterPoint(),\n this._originalOriginX,\n this._originalOriginY);\n\n this.originX = this._originalOriginX;\n this.originY = this._originalOriginY;\n\n this.left = originPoint.x;\n this.top = originPoint.y;\n\n this._originalOriginX = null;\n this._originalOriginY = null;\n },\n\n /**\n * @private\n */\n _getLeftTopCoords: function() {\n return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top');\n },\n });\n\n})();\n\n\n(function() {\n\n function getCoords(coords) {\n return [\n new fabric.Point(coords.tl.x, coords.tl.y),\n new fabric.Point(coords.tr.x, coords.tr.y),\n new fabric.Point(coords.br.x, coords.br.y),\n new fabric.Point(coords.bl.x, coords.bl.y)\n ];\n }\n\n var degreesToRadians = fabric.util.degreesToRadians,\n multiplyMatrices = fabric.util.multiplyTransformMatrices,\n transformPoint = fabric.util.transformPoint;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * properties are tl,mt,tr,ml,mr,bl,mb,br,mtr for the main controls.\n * each property is an object with x, y and corner.\n * The `corner` property contains in a similar manner the 4 points of the\n * interactive area of the corner.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, viewportTransform, top, left, padding.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcCoords;\n * @memberOf fabric.Object.prototype\n */\n oCoords: null,\n\n /**\n * Describe object's corner position in canvas object absolute coordinates\n * properties are tl,tr,bl,br and describe the four main corner.\n * each property is an object with x, y, instance of Fabric.Point.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, top, left.\n * Those coordinates are useful to understand where an object is. They get updated\n * with oCoords but they do not need to be updated when zoom or panning change.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcCoords(true);\n * @memberOf fabric.Object.prototype\n */\n aCoords: null,\n\n /**\n * storage for object transform matrix\n */\n ownMatrixCache: null,\n\n /**\n * storage for object full transform matrix\n */\n matrixCache: null,\n\n /**\n * return correct set of coordinates for intersection\n */\n getCoords: function(absolute, calculate) {\n if (!this.oCoords) {\n this.setCoords();\n }\n var coords = absolute ? this.aCoords : this.oCoords;\n return getCoords(calculate ? this.calcCoords(absolute) : coords);\n },\n\n /**\n * Checks if object intersects with an area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with an area formed by 2 points\n */\n intersectsWithRect: function(pointTL, pointBR, absolute, calculate) {\n var coords = this.getCoords(absolute, calculate),\n intersection = fabric.Intersection.intersectPolygonRectangle(\n coords,\n pointTL,\n pointBR\n );\n return intersection.status === 'Intersection';\n },\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject: function(other, absolute, calculate) {\n var intersection = fabric.Intersection.intersectPolygonPolygon(\n this.getCoords(absolute, calculate),\n other.getCoords(absolute, calculate)\n );\n\n return intersection.status === 'Intersection'\n || other.isContainedWithinObject(this, absolute, calculate)\n || this.isContainedWithinObject(other, absolute, calculate);\n },\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject: function(other, absolute, calculate) {\n var points = this.getCoords(absolute, calculate),\n i = 0, lines = other._getImageLines(\n calculate ? other.calcCoords(absolute) : absolute ? other.aCoords : other.oCoords\n );\n for (; i < 4; i++) {\n if (!other.containsPoint(points[i], lines)) {\n return false;\n }\n }\n return true;\n },\n\n /**\n * Checks if object is fully contained within area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area formed by 2 points\n */\n isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) {\n var boundingRect = this.getBoundingRect(absolute, calculate);\n\n return (\n boundingRect.left >= pointTL.x &&\n boundingRect.left + boundingRect.width <= pointBR.x &&\n boundingRect.top >= pointTL.y &&\n boundingRect.top + boundingRect.height <= pointBR.y\n );\n },\n\n /**\n * Checks if point is inside the object\n * @param {fabric.Point} point Point to check against\n * @param {Object} [lines] object returned from @method _getImageLines\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if point is inside the object\n */\n containsPoint: function(point, lines, absolute, calculate) {\n var lines = lines || this._getImageLines(\n calculate ? this.calcCoords(absolute) : absolute ? this.aCoords : this.oCoords\n ),\n xPoints = this._findCrossPoints(point, lines);\n\n // if xPoints is odd then point is inside the object\n return (xPoints !== 0 && xPoints % 2 === 1);\n },\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n var points = this.getCoords(true, calculate), point;\n for (var i = 0; i < 4; i++) {\n point = points[i];\n if (point.x <= pointBR.x && point.x >= pointTL.x && point.y <= pointBR.y && point.y >= pointTL.y) {\n return true;\n }\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Checks if the object contains the midpoint between canvas extremities\n * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen\n * @private\n * @param {Fabric.Point} pointTL Top Left point\n * @param {Fabric.Point} pointBR Top Right point\n * @param {Boolean} calculate use coordinates of current position instead of .oCoords\n * @return {Boolean} true if the object contains the point\n */\n _containsCenterOfCanvas: function(pointTL, pointBR, calculate) {\n // worst case scenario the object is so big that contains the screen\n var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 };\n if (this.containsPoint(centerPoint, null, true, calculate)) {\n return true;\n }\n return false;\n },\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Method that returns an object with the object edges in it, given the coordinates of the corners\n * @private\n * @param {Object} oCoords Coordinates of the object corners\n */\n _getImageLines: function(oCoords) {\n return {\n topline: {\n o: oCoords.tl,\n d: oCoords.tr\n },\n rightline: {\n o: oCoords.tr,\n d: oCoords.br\n },\n bottomline: {\n o: oCoords.br,\n d: oCoords.bl\n },\n leftline: {\n o: oCoords.bl,\n d: oCoords.tl\n }\n };\n },\n\n /**\n * Helper method to determine how many cross points are between the 4 object edges\n * and the horizontal line determined by a point on canvas\n * @private\n * @param {fabric.Point} point Point to check\n * @param {Object} lines Coordinates of the object being evaluated\n */\n // remove yi, not used but left code here just in case.\n _findCrossPoints: function(point, lines) {\n var b1, b2, a1, a2, xi, // yi,\n xcount = 0,\n iLine;\n\n for (var lineKey in lines) {\n iLine = lines[lineKey];\n // optimisation 1: line below point. no cross\n if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) {\n continue;\n }\n // optimisation 2: line above point. no cross\n if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) {\n continue;\n }\n // optimisation 3: vertical line case\n if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) {\n xi = iLine.o.x;\n // yi = point.y;\n }\n // calculate the intersection point\n else {\n b1 = 0;\n b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);\n a1 = point.y - b1 * point.x;\n a2 = iLine.o.y - b2 * iLine.o.x;\n\n xi = -(a1 - a2) / (b1 - b2);\n // yi = a1 + b1 * xi;\n }\n // dont count xi < point.x cases\n if (xi >= point.x) {\n xcount += 1;\n }\n // optimisation 4: specific for square images\n if (xcount === 2) {\n break;\n }\n }\n return xcount;\n },\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect: function(absolute, calculate) {\n var coords = this.getCoords(absolute, calculate);\n return fabric.util.makeBoundingBoxFromPoints(coords);\n },\n\n /**\n * Returns width of an object's bounding box counting transformations\n * before 2.0 it was named getWidth();\n * @return {Number} width value\n */\n getScaledWidth: function() {\n return this._getTransformedDimensions().x;\n },\n\n /**\n * Returns height of an object bounding box counting transformations\n * before 2.0 it was named getHeight();\n * @return {Number} height value\n */\n getScaledHeight: function() {\n return this._getTransformedDimensions().y;\n },\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @private\n * @param {Number} value\n * @return {Number}\n */\n _constrainScale: function(value) {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n }\n else {\n return this.minScaleLimit;\n }\n }\n else if (value === 0) {\n return 0.0001;\n }\n return value;\n },\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scale: function(value) {\n this._set('scaleX', value);\n this._set('scaleY', value);\n return this.setCoords();\n },\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToWidth: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n },\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToHeight: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n },\n\n /**\n * Calculates and returns the .coords of an object.\n * @return {Object} Object with tl, tr, br, bl ....\n * @chainable\n */\n calcCoords: function(absolute) {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n startMatrix = multiplyMatrices(translateMatrix, rotateMatrix),\n vpt = this.getViewportTransform(),\n finalMatrix = absolute ? startMatrix : multiplyMatrices(vpt, startMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2, h = dim.y / 2,\n tl = transformPoint({ x: -w, y: -h }, finalMatrix),\n tr = transformPoint({ x: w, y: -h }, finalMatrix),\n bl = transformPoint({ x: -w, y: h }, finalMatrix),\n br = transformPoint({ x: w, y: h }, finalMatrix);\n if (!absolute) {\n var padding = this.padding, angle = degreesToRadians(this.angle),\n cos = fabric.util.cos(angle), sin = fabric.util.sin(angle),\n cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP;\n if (padding) {\n tl.x -= cosPMinusSinP;\n tl.y -= cosPSinP;\n tr.x += cosPSinP;\n tr.y -= cosPMinusSinP;\n bl.x -= cosPSinP;\n bl.y += cosPMinusSinP;\n br.x += cosPMinusSinP;\n br.y += cosPSinP;\n }\n var ml = new fabric.Point((tl.x + bl.x) / 2, (tl.y + bl.y) / 2),\n mt = new fabric.Point((tr.x + tl.x) / 2, (tr.y + tl.y) / 2),\n mr = new fabric.Point((br.x + tr.x) / 2, (br.y + tr.y) / 2),\n mb = new fabric.Point((br.x + bl.x) / 2, (br.y + bl.y) / 2),\n mtr = new fabric.Point(mt.x + sin * this.rotatingPointOffset, mt.y - cos * this.rotatingPointOffset);\n }\n\n // if (!absolute) {\n // var canvas = this.canvas;\n // setTimeout(function() {\n // canvas.contextTop.clearRect(0, 0, 700, 700);\n // canvas.contextTop.fillStyle = 'green';\n // canvas.contextTop.fillRect(mb.x, mb.y, 3, 3);\n // canvas.contextTop.fillRect(bl.x, bl.y, 3, 3);\n // canvas.contextTop.fillRect(br.x, br.y, 3, 3);\n // canvas.contextTop.fillRect(tl.x, tl.y, 3, 3);\n // canvas.contextTop.fillRect(tr.x, tr.y, 3, 3);\n // canvas.contextTop.fillRect(ml.x, ml.y, 3, 3);\n // canvas.contextTop.fillRect(mr.x, mr.y, 3, 3);\n // canvas.contextTop.fillRect(mt.x, mt.y, 3, 3);\n // canvas.contextTop.fillRect(mtr.x, mtr.y, 3, 3);\n // }, 50);\n // }\n\n var coords = {\n // corners\n tl: tl, tr: tr, br: br, bl: bl,\n };\n if (!absolute) {\n // middle\n coords.ml = ml;\n coords.mt = mt;\n coords.mr = mr;\n coords.mb = mb;\n // rotating point\n coords.mtr = mtr;\n }\n return coords;\n },\n\n /**\n * Sets corner position coordinates based on current angle, width and height.\n * See {@link https://github.com/kangax/fabric.js/wiki/When-to-call-setCoords|When-to-call-setCoords}\n * @param {Boolean} [ignoreZoom] set oCoords with or without the viewport transform.\n * @param {Boolean} [skipAbsolute] skip calculation of aCoords, useful in setViewportTransform\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setCoords: function(ignoreZoom, skipAbsolute) {\n this.oCoords = this.calcCoords(ignoreZoom);\n if (!skipAbsolute) {\n this.aCoords = this.calcCoords(true);\n }\n\n // set coordinates of the draggable boxes in the corners used to scale/rotate the image\n ignoreZoom || (this._setCornerCoords && this._setCornerCoords());\n\n return this;\n },\n\n /**\n * calculate rotation matrix of an object\n * @return {Array} rotation matrix for the object\n */\n _calcRotateMatrix: function() {\n return fabric.util.calcRotateMatrix(this);\n },\n\n /**\n * calculate the translation matrix for an object transform\n * @return {Array} rotation matrix for the object\n */\n _calcTranslateMatrix: function() {\n var center = this.getCenterPoint();\n return [1, 0, 0, 1, center.x, center.y];\n },\n\n transformMatrixKey: function(skipGroup) {\n var sep = '_', prefix = '';\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup) + sep;\n };\n return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY +\n sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY +\n sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * @return {Array} transform matrix for the object\n */\n calcTransformMatrix: function(skipGroup) {\n if (skipGroup) {\n return this.calcOwnMatrix();\n }\n var key = this.transformMatrixKey(), cache = this.matrixCache || (this.matrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var matrix = this.calcOwnMatrix();\n if (this.group) {\n matrix = multiplyMatrices(this.group.calcTransformMatrix(), matrix);\n }\n cache.key = key;\n cache.value = matrix;\n return matrix;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {Array} transform matrix for the object\n */\n calcOwnMatrix: function() {\n var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var tMatrix = this._calcTranslateMatrix();\n this.translateX = tMatrix[4];\n this.translateY = tMatrix[5];\n cache.key = key;\n cache.value = fabric.util.composeMatrix(this);\n return cache.value;\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @deprecated since 3.4.0, please use fabric.util._calcDimensionsTransformMatrix\n * not including or including flipX, flipY to emulate the flipping boolean\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _calcDimensionsTransformMatrix: function(skewX, skewY, flipping) {\n return fabric.util.calcDimensionsMatrix({\n skewX: skewX,\n skewY: skewY,\n scaleX: this.scaleX * (flipping && this.flipX ? -1 : 1),\n scaleY: this.scaleY * (flipping && this.flipY ? -1 : 1)\n });\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getNonTransformedDimensions: function() {\n var strokeWidth = this.strokeWidth,\n w = this.width + strokeWidth,\n h = this.height + strokeWidth;\n return { x: w, y: h };\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param {Number} skewX, a value to override current skewX\n * @param {Number} skewY, a value to override current skewY\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getTransformedDimensions: function(skewX, skewY) {\n if (typeof skewX === 'undefined') {\n skewX = this.skewX;\n }\n if (typeof skewY === 'undefined') {\n skewY = this.skewY;\n }\n var dimensions = this._getNonTransformedDimensions(), dimX, dimY,\n noSkew = skewX === 0 && skewY === 0;\n\n if (this.strokeUniform) {\n dimX = this.width;\n dimY = this.height;\n }\n else {\n dimX = dimensions.x;\n dimY = dimensions.y;\n }\n if (noSkew) {\n return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY);\n }\n else {\n dimX /= 2;\n dimY /= 2;\n }\n var points = [\n {\n x: -dimX,\n y: -dimY\n },\n {\n x: dimX,\n y: -dimY\n },\n {\n x: -dimX,\n y: dimY\n },\n {\n x: dimX,\n y: dimY\n }],\n transformMatrix = fabric.util.calcDimensionsMatrix({\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n }),\n bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix);\n return this._finalizeDimensions(bbox.width, bbox.height);\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param Number width width of the bbox\n * @param Number height height of the bbox\n * @private\n * @return {Object} .x finalized width dimension\n * @return {Object} .y finalized height dimension\n */\n _finalizeDimensions: function(width, height) {\n return this.strokeUniform ?\n { x: width + this.strokeWidth, y: height + this.strokeWidth }\n :\n { x: width, y: height };\n },\n /*\n * Calculate object dimensions for controls, including padding and canvas zoom.\n * private\n */\n _calculateCurrentDimensions: function() {\n var vpt = this.getViewportTransform(),\n dim = this._getTransformedDimensions(),\n p = fabric.util.transformPoint(dim, vpt, true);\n\n return p.scalarAdd(2 * this.padding);\n },\n });\n})();\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Moves an object to the bottom of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendToBack: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendToBack.call(this.group, this);\n }\n else {\n this.canvas.sendToBack(this);\n }\n return this;\n },\n\n /**\n * Moves an object to the top of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringToFront: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringToFront.call(this.group, this);\n }\n else {\n this.canvas.bringToFront(this);\n }\n return this;\n },\n\n /**\n * Moves an object down in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendBackwards: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting);\n }\n else {\n this.canvas.sendBackwards(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object up in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringForward: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting);\n }\n else {\n this.canvas.bringForward(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {Number} index New position of object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n moveTo: function(index) {\n if (this.group && this.group.type !== 'activeSelection') {\n fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index);\n }\n else {\n this.canvas.moveTo(this, index);\n }\n return this;\n }\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n function getSvgColorString(prop, value) {\n if (!value) {\n return prop + ': none; ';\n }\n else if (value.toLive) {\n return prop + ': url(#SVGID_' + value.id + '); ';\n }\n else {\n var color = new fabric.Color(value),\n str = prop + ': ' + color.toRgb() + '; ',\n opacity = color.getAlpha();\n if (opacity !== 1) {\n //change the color in rgb + opacity\n str += prop + '-opacity: ' + opacity.toString() + '; ';\n }\n return str;\n }\n }\n\n var toFixed = fabric.util.toFixed;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n\n var fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = getSvgColorString('fill', this.fill),\n stroke = getSvgColorString('stroke', this.stroke);\n\n return [\n stroke,\n 'stroke-width: ', strokeWidth, '; ',\n 'stroke-dasharray: ', strokeDashArray, '; ',\n 'stroke-linecap: ', strokeLineCap, '; ',\n 'stroke-dashoffset: ', strokeDashOffset, '; ',\n 'stroke-linejoin: ', strokeLineJoin, '; ',\n 'stroke-miterlimit: ', strokeMiterLimit, '; ',\n fill,\n 'fill-rule: ', fillRule, '; ',\n 'opacity: ', opacity, ';',\n filter,\n visibility\n ].join('');\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles: function(style, useWhiteSpace) {\n var term = '; ';\n var fontFamily = style.fontFamily ?\n 'font-family: ' + (((style.fontFamily.indexOf('\\'') === -1 && style.fontFamily.indexOf('\"') === -1) ?\n '\\'' + style.fontFamily + '\\'' : style.fontFamily)) + term : '';\n var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '',\n fontFamily = fontFamily,\n fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '',\n fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '',\n fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '',\n fill = style.fill ? getSvgColorString('fill', style.fill) : '',\n stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '',\n textDecoration = this.getSvgTextDecoration(style),\n deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : '';\n if (textDecoration) {\n textDecoration = 'text-decoration: ' + textDecoration + term;\n }\n\n return [\n stroke,\n strokeWidth,\n fontFamily,\n fontSize,\n fontStyle,\n fontWeight,\n textDecoration,\n fill,\n deltaY,\n useWhiteSpace ? 'white-space: pre; ' : ''\n ].join('');\n },\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration: function(style) {\n if ('overline' in style || 'underline' in style || 'linethrough' in style) {\n return (style.overline ? 'overline ' : '') +\n (style.underline ? 'underline ' : '') + (style.linethrough ? 'line-through ' : '');\n }\n return '';\n },\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter: function() {\n return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : '';\n },\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons: function() {\n return [\n this.id ? 'id=\"' + this.id + '\" ' : '',\n this.clipPath ? 'clip-path=\"url(#' + this.clipPath.clipPathId + ')\" ' : '',\n ].join('');\n },\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform: function(full, additionalTransform) {\n var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = 'transform=\"' + fabric.util.matrixToSVG(transform);\n return svgTransform +\n (additionalTransform || '') + this.getSvgTransformMatrix() + '\" ';\n },\n\n /**\n * Returns transform-string for svg-export from the transform matrix of single elements\n * @return {String}\n */\n getSvgTransformMatrix: function() {\n return this.transformMatrix ? ' ' + fabric.util.matrixToSVG(this.transformMatrix) : '';\n },\n\n _setSVGBg: function(textBgRects) {\n if (this.backgroundColor) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n }\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n return '\\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var reviver = options.reviver,\n additionalTransform = options.additionalTransform || '',\n commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n },\n\n /**\n * @private\n */\n _createBaseSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var noStyle = options.noStyle,\n reviver = options.reviver,\n styleInfo = noStyle ? '' : 'style=\"' + this.getSvgStyles() + '\" ',\n shadowInfo = options.withShadow ? 'style=\"' + this.getSvgFilter() + '\" ' : '',\n clipPath = this.clipPath,\n vectorEffect = this.strokeUniform ? 'vector-effect=\"non-scaling-stroke\" ' : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke, fill = this.fill, shadow = this.shadow,\n commonPieces, markup = [], clipPathMarkup,\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS'),\n additionalTransform = options.additionalTransform;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n clipPathMarkup = '\\n' +\n clipPath.toClipPathSVG(reviver) +\n '\\n';\n }\n if (absoluteClipPath) {\n markup.push(\n '\\n'\n );\n }\n markup.push(\n '\\n'\n );\n commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(), ' ',\n additionalTransform ? 'transform=\"' + additionalTransform + '\" ' : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (fill && fill.toLive) {\n markup.push(fill.toSVG(this));\n }\n if (stroke && stroke.toLive) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n },\n\n addPaintOrder: function() {\n return this.paintFirst !== 'fill' ? ' paint-order=\"' + this.paintFirst + '\" ' : '';\n }\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function() {\n\n var extend = fabric.util.object.extend,\n originalSet = 'stateProperties';\n\n /*\n Depends on `stateProperties`\n */\n function saveProps(origin, destination, props) {\n var tmpObj = { }, deep = true;\n props.forEach(function(prop) {\n tmpObj[prop] = origin[prop];\n });\n extend(origin[destination], tmpObj, deep);\n }\n\n function _isEqual(origValue, currentValue, firstPass) {\n if (origValue === currentValue) {\n // if the objects are identical, return\n return true;\n }\n else if (Array.isArray(origValue)) {\n if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) {\n return false;\n }\n for (var i = 0, len = origValue.length; i < len; i++) {\n if (!_isEqual(origValue[i], currentValue[i])) {\n return false;\n }\n }\n return true;\n }\n else if (origValue && typeof origValue === 'object') {\n var keys = Object.keys(origValue), key;\n if (!currentValue ||\n typeof currentValue !== 'object' ||\n (!firstPass && keys.length !== Object.keys(currentValue).length)\n ) {\n return false;\n }\n for (var i = 0, len = keys.length; i < len; i++) {\n key = keys[i];\n // since clipPath is in the statefull cache list and the clipPath objects\n // would be iterated as an object, this would lead to possible infinite recursion\n if (key === 'canvas') {\n continue;\n }\n if (!_isEqual(origValue[key], currentValue[key])) {\n return false;\n }\n }\n return true;\n }\n }\n\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Returns true if object state (one of its state properties) was changed\n * @param {String} [propertySet] optional name for the set of property we want to save\n * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called\n */\n hasStateChanged: function(propertySet) {\n propertySet = propertySet || originalSet;\n var dashedPropertySet = '_' + propertySet;\n if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) {\n return true;\n }\n return !_isEqual(this[dashedPropertySet], this, true);\n },\n\n /**\n * Saves state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n saveState: function(options) {\n var propertySet = options && options.propertySet || originalSet,\n destination = '_' + propertySet;\n if (!this[destination]) {\n return this.setupState(options);\n }\n saveProps(this, destination, this[propertySet]);\n if (options && options.stateProperties) {\n saveProps(this, destination, options.stateProperties);\n }\n return this;\n },\n\n /**\n * Setups state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n setupState: function(options) {\n options = options || { };\n var propertySet = options.propertySet || originalSet;\n options.propertySet = propertySet;\n this['_' + propertySet] = { };\n this.saveState(options);\n return this;\n }\n });\n})();\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * The object interactivity controls.\n * @private\n */\n _controlsVisibility: null,\n\n /**\n * Determines which corner has been clicked\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found\n */\n _findTargetCorner: function(pointer) {\n // objects in group, anykind, are not self modificable,\n // must not return an hovered corner.\n if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) {\n return false;\n }\n\n var ex = pointer.x,\n ey = pointer.y,\n xPoints,\n lines;\n this.__corner = 0;\n for (var i in this.oCoords) {\n\n if (!this.isControlVisible(i)) {\n continue;\n }\n\n if (i === 'mtr' && !this.hasRotatingPoint) {\n continue;\n }\n\n if (this.get('lockUniScaling') &&\n (i === 'mt' || i === 'mr' || i === 'mb' || i === 'ml')) {\n continue;\n }\n\n lines = this._getImageLines(this.oCoords[i].corner);\n\n // debugging\n\n // canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n\n // canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n\n xPoints = this._findCrossPoints({ x: ex, y: ey }, lines);\n if (xPoints !== 0 && xPoints % 2 === 1) {\n this.__corner = i;\n return i;\n }\n }\n return false;\n },\n\n /**\n * Sets the coordinates of the draggable boxes in the corners of\n * the image used to scale/rotate it.\n * @private\n */\n _setCornerCoords: function() {\n var coords = this.oCoords,\n newTheta = degreesToRadians(45 - this.angle),\n /* Math.sqrt(2 * Math.pow(this.cornerSize, 2)) / 2, */\n /* 0.707106 stands for sqrt(2)/2 */\n cornerHypotenuse = this.cornerSize * 0.707106,\n cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta),\n sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta),\n x, y;\n\n for (var point in coords) {\n x = coords[point].x;\n y = coords[point].y;\n coords[point].corner = {\n tl: {\n x: x - sinHalfOffset,\n y: y - cosHalfOffset\n },\n tr: {\n x: x + cosHalfOffset,\n y: y - sinHalfOffset\n },\n bl: {\n x: x - cosHalfOffset,\n y: y + sinHalfOffset\n },\n br: {\n x: x + sinHalfOffset,\n y: y + cosHalfOffset\n }\n };\n }\n },\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawSelectionBackground: function(ctx) {\n if (!this.selectionBackgroundColor ||\n (this.canvas && !this.canvas.interactive) ||\n (this.canvas && this.canvas._activeObject !== this)\n ) {\n return this;\n }\n ctx.save();\n var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(),\n vpt = this.canvas.viewportTransform;\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBorders: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n strokeWidth = 1 / this.borderScaleFactor,\n width = wh.x + strokeWidth,\n height = wh.y + strokeWidth,\n drawRotatingPoint = typeof styleOverride.hasRotatingPoint !== 'undefined' ?\n styleOverride.hasRotatingPoint : this.hasRotatingPoint,\n hasControls = typeof styleOverride.hasControls !== 'undefined' ?\n styleOverride.hasControls : this.hasControls,\n rotatingPointOffset = typeof styleOverride.rotatingPointOffset !== 'undefined' ?\n styleOverride.rotatingPointOffset : this.rotatingPointOffset;\n\n ctx.save();\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray, null);\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n if (drawRotatingPoint && this.isControlVisible('mtr') && hasControls) {\n\n var rotateHeight = -height / 2;\n\n ctx.beginPath();\n ctx.moveTo(0, rotateHeight);\n ctx.lineTo(0, rotateHeight - rotatingPointOffset);\n ctx.stroke();\n }\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box when it is inside a group.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBordersInGroup: function(ctx, options, styleOverride) {\n styleOverride = styleOverride || {};\n var p = this._getNonTransformedDimensions(),\n matrix = fabric.util.composeMatrix({\n scaleX: options.scaleX,\n scaleY: options.scaleY,\n skewX: options.skewX\n }),\n wh = fabric.util.transformPoint(p, matrix),\n strokeWidth = 1 / this.borderScaleFactor,\n width = wh.x + strokeWidth,\n height = wh.y + strokeWidth;\n\n ctx.save();\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray, null);\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawControls: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n width = wh.x,\n height = wh.y,\n scaleOffset = styleOverride.cornerSize || this.cornerSize,\n left = -(width + scaleOffset) / 2,\n top = -(height + scaleOffset) / 2,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : this.transparentCorners,\n hasRotatingPoint = typeof styleOverride.hasRotatingPoint !== 'undefined' ?\n styleOverride.hasRotatingPoint : this.hasRotatingPoint,\n methodName = transparentCorners ? 'stroke' : 'fill';\n\n ctx.save();\n ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor;\n }\n this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray, null);\n\n // top-left\n this._drawControl('tl', ctx, methodName,\n left,\n top, styleOverride);\n\n // top-right\n this._drawControl('tr', ctx, methodName,\n left + width,\n top, styleOverride);\n\n // bottom-left\n this._drawControl('bl', ctx, methodName,\n left,\n top + height, styleOverride);\n\n // bottom-right\n this._drawControl('br', ctx, methodName,\n left + width,\n top + height, styleOverride);\n\n if (!this.get('lockUniScaling')) {\n\n // middle-top\n this._drawControl('mt', ctx, methodName,\n left + width / 2,\n top, styleOverride);\n\n // middle-bottom\n this._drawControl('mb', ctx, methodName,\n left + width / 2,\n top + height, styleOverride);\n\n // middle-right\n this._drawControl('mr', ctx, methodName,\n left + width,\n top + height / 2, styleOverride);\n\n // middle-left\n this._drawControl('ml', ctx, methodName,\n left,\n top + height / 2, styleOverride);\n }\n\n // middle-top-rotate\n if (hasRotatingPoint) {\n this._drawControl('mtr', ctx, methodName,\n left + width / 2,\n top - this.rotatingPointOffset, styleOverride);\n }\n\n ctx.restore();\n\n return this;\n },\n\n /**\n * @private\n */\n _drawControl: function(control, ctx, methodName, left, top, styleOverride) {\n styleOverride = styleOverride || {};\n if (!this.isControlVisible(control)) {\n return;\n }\n var size = this.cornerSize, stroke = !this.transparentCorners && this.cornerStrokeColor;\n switch (styleOverride.cornerStyle || this.cornerStyle) {\n case 'circle':\n ctx.beginPath();\n ctx.arc(left + size / 2, top + size / 2, size / 2, 0, 2 * Math.PI, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n break;\n default:\n this.transparentCorners || ctx.clearRect(left, top, size, size);\n ctx[methodName + 'Rect'](left, top, size, size);\n if (stroke) {\n ctx.strokeRect(left, top, size, size);\n }\n }\n },\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {String} controlName The name of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @returns {Boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible: function(controlName) {\n return this._getControlsVisibility()[controlName];\n },\n\n /**\n * Sets the visibility of the specified control.\n * @param {String} controlName The name of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlVisible: function(controlName, visible) {\n this._getControlsVisibility()[controlName] = visible;\n return this;\n },\n\n /**\n * Sets the visibility state of object controls.\n * @param {Object} [options] Options object\n * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it\n * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it\n * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it\n * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it\n * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it\n * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it\n * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it\n * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlsVisibility: function(options) {\n options || (options = { });\n\n for (var p in options) {\n this.setControlVisible(p, options[p]);\n }\n return this;\n },\n\n /**\n * Returns the instance of the control visibility set for this object.\n * @private\n * @returns {Object}\n */\n _getControlsVisibility: function() {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {\n tl: true,\n tr: true,\n br: true,\n bl: true,\n ml: true,\n mt: true,\n mr: true,\n mb: true,\n mtr: true\n };\n }\n return this._controlsVisibility;\n },\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onDeselect: function() {\n // implemented by sub-classes, as needed.\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onSelect: function() {\n // implemented by sub-classes, as needed.\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Animation duration (in ms) for fx* methods\n * @type Number\n * @default\n */\n FX_DURATION: 500,\n\n /**\n * Centers object horizontally with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxCenterObjectH: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.left,\n endValue: this.getCenter().left,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('left', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n\n return this;\n },\n\n /**\n * Centers object vertically with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxCenterObjectV: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.top,\n endValue: this.getCenter().top,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('top', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n\n return this;\n },\n\n /**\n * Same as `fabric.Canvas#remove` but animated\n * @param {fabric.Object} object Object to remove\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxRemove: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: object.opacity,\n endValue: 0,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('opacity', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function () {\n _this.remove(object);\n onComplete();\n }\n });\n\n return this;\n }\n});\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Animates object's properties\n * @param {String|Object} property Property to animate (if string) or properties to animate (if object)\n * @param {Number|Object} value Value to animate property to (if string was given first) or options object\n * @return {fabric.Object} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @chainable\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n *\n * As string — one property\n *\n * object.animate('left', ...);\n * object.animate('left', { duration: ... });\n *\n */\n animate: function() {\n if (arguments[0] && typeof arguments[0] === 'object') {\n var propsToAnimate = [], prop, skipCallbacks;\n for (prop in arguments[0]) {\n propsToAnimate.push(prop);\n }\n for (var i = 0, len = propsToAnimate.length; i < len; i++) {\n prop = propsToAnimate[i];\n skipCallbacks = i !== len - 1;\n this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks);\n }\n }\n else {\n this._animate.apply(this, arguments);\n }\n return this;\n },\n\n /**\n * @private\n * @param {String} property Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked\n */\n _animate: function(property, to, options, skipCallbacks) {\n var _this = this, propPair;\n\n to = to.toString();\n\n if (!options) {\n options = { };\n }\n else {\n options = fabric.util.object.clone(options);\n }\n\n if (~property.indexOf('.')) {\n propPair = property.split('.');\n }\n\n var currentValue = propPair\n ? this.get(propPair[0])[propPair[1]]\n : this.get(property);\n\n if (!('from' in options)) {\n options.from = currentValue;\n }\n\n if (~to.indexOf('=')) {\n to = currentValue + parseFloat(to.replace('=', ''));\n }\n else {\n to = parseFloat(to);\n }\n\n fabric.util.animate({\n startValue: options.from,\n endValue: to,\n byValue: options.by,\n easing: options.easing,\n duration: options.duration,\n abort: options.abort && function() {\n return options.abort.call(_this);\n },\n onChange: function(value, valueProgress, timeProgress) {\n if (propPair) {\n _this[propPair[0]][propPair[1]] = value;\n }\n else {\n _this.set(property, value);\n }\n if (skipCallbacks) {\n return;\n }\n options.onChange && options.onChange(value, valueProgress, timeProgress);\n },\n onComplete: function(value, valueProgress, timeProgress) {\n if (skipCallbacks) {\n return;\n }\n\n _this.setCoords();\n options.onComplete && options.onComplete(value, valueProgress, timeProgress);\n }\n });\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 },\n supportsLineDash = fabric.StaticCanvas.supports('setLineDash');\n\n if (fabric.Line) {\n fabric.warn('fabric.Line is already defined');\n return;\n }\n\n /**\n * Line class\n * @class fabric.Line\n * @extends fabric.Object\n * @see {@link fabric.Line#initialize} for constructor definition\n */\n fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'line',\n\n /**\n * x value or first line edge\n * @type Number\n * @default\n */\n x1: 0,\n\n /**\n * y value or first line edge\n * @type Number\n * @default\n */\n y1: 0,\n\n /**\n * x value or second line edge\n * @type Number\n * @default\n */\n x2: 0,\n\n /**\n * y value or second line edge\n * @type Number\n * @default\n */\n y2: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'),\n\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {fabric.Line} thisArg\n */\n initialize: function(points, options) {\n if (!points) {\n points = [0, 0, 0, 0];\n }\n\n this.callSuper('initialize', options);\n\n this.set('x1', points[0]);\n this.set('y1', points[1]);\n this.set('x2', points[2]);\n this.set('y2', points[3]);\n\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n\n this.width = Math.abs(this.x2 - this.x1);\n this.height = Math.abs(this.y2 - this.y1);\n\n this.left = 'left' in options\n ? options.left\n : this._getLeftToOriginX();\n\n this.top = 'top' in options\n ? options.top\n : this._getTopToOriginY();\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n if (typeof coordProps[key] !== 'undefined') {\n this._setWidthHeight();\n }\n return this;\n },\n\n /**\n * @private\n * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line.\n */\n _getLeftToOriginX: makeEdgeToOriginGetter(\n { // property names\n origin: 'originX',\n axis1: 'x1',\n axis2: 'x2',\n dimension: 'width'\n },\n { // possible values of origin\n nearest: 'left',\n center: 'center',\n farthest: 'right'\n }\n ),\n\n /**\n * @private\n * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line.\n */\n _getTopToOriginY: makeEdgeToOriginGetter(\n { // property names\n origin: 'originY',\n axis1: 'y1',\n axis2: 'y2',\n dimension: 'height'\n },\n { // possible values of origin\n nearest: 'top',\n center: 'center',\n farthest: 'bottom'\n }\n ),\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n\n if (!this.strokeDashArray || this.strokeDashArray && supportsLineDash) {\n // move from center (of virtual box) to its left/top corner\n // we can't assume x1, y1 is top left and x2, y2 is bottom right\n var p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n }\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n var origStrokeStyle = ctx.strokeStyle;\n ctx.strokeStyle = this.stroke || ctx.fillStyle;\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var p = this.calcLinePoints();\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, p.x1, p.y1, p.x2, p.y2, this.strokeDashArray);\n ctx.closePath();\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return {\n x: (this.x1 + this.x2) / 2,\n y: (this.y1 + this.y2) / 2,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @methd toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints());\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions: function() {\n var dim = this.callSuper('_getNonTransformedDimensions');\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n },\n\n /**\n * Recalculates line points given width and height\n * @private\n */\n calcLinePoints: function() {\n var xMult = this.x1 <= this.x2 ? -1 : 1,\n yMult = this.y1 <= this.y2 ? -1 : 1,\n x1 = (xMult * this.width * 0.5),\n y1 = (yMult * this.height * 0.5),\n x2 = (xMult * this.width * -0.5),\n y2 = (yMult * this.height * -0.5);\n\n return {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2\n };\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var p = this.calcLinePoints();\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement})\n * @static\n * @memberOf fabric.Line\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' '));\n\n /**\n * Returns fabric.Line instance from an SVG element\n * @static\n * @memberOf fabric.Line\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n fabric.Line.fromElement = function(element, callback, options) {\n options = options || { };\n var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES),\n points = [\n parsedAttributes.x1 || 0,\n parsedAttributes.y1 || 0,\n parsedAttributes.x2 || 0,\n parsedAttributes.y2 || 0\n ];\n callback(new fabric.Line(points, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Line instance from an object representation\n * @static\n * @memberOf fabric.Line\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Line.fromObject = function(object, callback) {\n function _callback(instance) {\n delete instance.points;\n callback && callback(instance);\n };\n var options = clone(object, true);\n options.points = [object.x1, object.y1, object.x2, object.y2];\n fabric.Object._fromObject('Line', options, _callback, 'points');\n };\n\n /**\n * Produces a function that calculates distance from canvas edge to Line origin.\n */\n function makeEdgeToOriginGetter(propertyNames, originValues) {\n var origin = propertyNames.origin,\n axis1 = propertyNames.axis1,\n axis2 = propertyNames.axis2,\n dimension = propertyNames.dimension,\n nearest = originValues.nearest,\n center = originValues.center,\n farthest = originValues.farthest;\n\n return function() {\n switch (this.get(origin)) {\n case nearest:\n return Math.min(this.get(axis1), this.get(axis2));\n case center:\n return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension));\n case farthest:\n return Math.max(this.get(axis1), this.get(axis2));\n }\n };\n\n }\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n pi = Math.PI;\n\n if (fabric.Circle) {\n fabric.warn('fabric.Circle is already defined.');\n return;\n }\n\n /**\n * Circle class\n * @class fabric.Circle\n * @extends fabric.Object\n * @see {@link fabric.Circle#initialize} for constructor definition\n */\n fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'circle',\n\n /**\n * Radius of this circle\n * @type Number\n * @default\n */\n radius: 0,\n\n /**\n * Start angle of the circle, moving clockwise\n * deprectated type, this should be in degree, this was an oversight.\n * probably will change to degrees in next major version\n * @type Number\n * @default 0\n */\n startAngle: 0,\n\n /**\n * End angle of the circle\n * deprectated type, this should be in degree, this was an oversight.\n * probably will change to degrees in next major version\n * @type Number\n * @default 2Pi\n */\n endAngle: pi * 2,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'),\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Circle} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString, x = 0, y = 0,\n angle = (this.endAngle - this.startAngle) % ( 2 * pi);\n\n if (angle === 0) {\n svgString = [\n '\\n'\n ];\n }\n else {\n var startX = fabric.util.cos(this.startAngle) * this.radius,\n startY = fabric.util.sin(this.startAngle) * this.radius,\n endX = fabric.util.cos(this.endAngle) * this.radius,\n endY = fabric.util.sin(this.endAngle) * this.radius,\n largeFlag = angle > pi ? '1' : '0';\n svgString = [\n '\\n'\n ];\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n this.startAngle,\n this.endAngle, false);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX: function() {\n return this.get('radius') * this.get('scaleX');\n },\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY: function() {\n return this.get('radius') * this.get('scaleY');\n },\n\n /**\n * Sets radius of an object (and updates width accordingly)\n * @return {fabric.Circle} thisArg\n */\n setRadius: function(value) {\n this.radius = value;\n return this.set('width', value * 2).set('height', value * 2);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement})\n * @static\n * @memberOf fabric.Circle\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' '));\n\n /**\n * Returns {@link fabric.Circle} instance from an SVG element\n * @static\n * @memberOf fabric.Circle\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @param {Object} [options] Options object\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n fabric.Circle.fromElement = function(element, callback) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);\n\n if (!isValidRadius(parsedAttributes)) {\n throw new Error('value of `r` attribute is required and can not be negative');\n }\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius;\n callback(new fabric.Circle(parsedAttributes));\n };\n\n /**\n * @private\n */\n function isValidRadius(attributes) {\n return (('radius' in attributes) && (attributes.radius >= 0));\n }\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Circle} instance from an object representation\n * @static\n * @memberOf fabric.Circle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {Object} Instance of fabric.Circle\n */\n fabric.Circle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Circle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Triangle) {\n fabric.warn('fabric.Triangle is already defined');\n return;\n }\n\n /**\n * Triangle class\n * @class fabric.Triangle\n * @extends fabric.Object\n * @return {fabric.Triangle} thisArg\n * @see {@link fabric.Triangle#initialize} for constructor definition\n */\n fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'triangle',\n\n /**\n * Width is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n width: 100,\n\n /**\n * Height is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n height: 100,\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, -widthBy2, heightBy2, 0, -heightBy2, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, 0, -heightBy2, widthBy2, heightBy2, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, widthBy2, heightBy2, -widthBy2, heightBy2, this.strokeDashArray);\n ctx.closePath();\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = [\n -widthBy2 + ' ' + heightBy2,\n '0 ' + -heightBy2,\n widthBy2 + ' ' + heightBy2\n ].join(',');\n return [\n ''\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Triangle} instance from an object representation\n * @static\n * @memberOf fabric.Triangle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Triangle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Triangle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n piBy2 = Math.PI * 2;\n\n if (fabric.Ellipse) {\n fabric.warn('fabric.Ellipse is already defined.');\n return;\n }\n\n /**\n * Ellipse class\n * @class fabric.Ellipse\n * @extends fabric.Object\n * @return {fabric.Ellipse} thisArg\n * @see {@link fabric.Ellipse#initialize} for constructor definition\n */\n fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'ellipse',\n\n /**\n * Horizontal radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {fabric.Ellipse} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this.set('rx', options && options.rx || 0);\n this.set('ry', options && options.ry || 0);\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Ellipse} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n switch (key) {\n\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n\n }\n return this;\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx: function() {\n return this.get('rx') * this.get('scaleX');\n },\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy: function() {\n return this.get('ry') * this.get('scaleY');\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(\n 0,\n 0,\n this.rx,\n 0,\n piBy2,\n false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})\n * @static\n * @memberOf fabric.Ellipse\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' '));\n\n /**\n * Returns {@link fabric.Ellipse} instance from an SVG element\n * @static\n * @memberOf fabric.Ellipse\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromElement = function(element, callback) {\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n callback(new fabric.Ellipse(parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Ellipse} instance from an object representation\n * @static\n * @memberOf fabric.Ellipse\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Ellipse', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend;\n\n if (fabric.Rect) {\n fabric.warn('fabric.Rect is already defined');\n return;\n }\n\n /**\n * Rectangle class\n * @class fabric.Rect\n * @extends fabric.Object\n * @return {fabric.Rect} thisArg\n * @see {@link fabric.Rect#initialize} for constructor definition\n */\n fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ {\n\n /**\n * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'),\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'rect',\n\n /**\n * Horizontal border radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical border radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this._initRxRy();\n },\n\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy: function() {\n if (this.rx && !this.ry) {\n this.ry = this.rx;\n }\n else if (this.ry && !this.rx) {\n this.rx = this.ry;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n\n // 1x1 case (used in spray brush) optimization was removed because\n // with caching and higher zoom level this makes more damage than help\n\n var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0,\n ry = this.ry ? Math.min(this.ry, this.height / 2) : 0,\n w = this.width,\n h = this.height,\n x = -this.width / 2,\n y = -this.height / 2,\n isRounded = rx !== 0 || ry !== 0,\n /* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\n k = 1 - 0.5522847498;\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry);\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h);\n\n ctx.lineTo(x + rx, y + h);\n isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry);\n\n ctx.lineTo(x, y + ry);\n isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var x = -this.width / 2,\n y = -this.height / 2,\n w = this.width,\n h = this.height;\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, x, y, x + w, y, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y, x + w, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y + h, x, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x, y + h, x, y, this.strokeDashArray);\n ctx.closePath();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var x = -this.width / 2, y = -this.height / 2;\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`)\n * @static\n * @memberOf fabric.Rect\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' '));\n\n /**\n * Returns {@link fabric.Rect} instance from an SVG element\n * @static\n * @memberOf fabric.Rect\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Rect.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options = options || { };\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = parsedAttributes.left || 0;\n parsedAttributes.top = parsedAttributes.top || 0;\n parsedAttributes.height = parsedAttributes.height || 0;\n parsedAttributes.width = parsedAttributes.width || 0;\n var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n rect.visible = rect.visible && rect.width > 0 && rect.height > 0;\n callback(rect);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Rect} instance from an object representation\n * @static\n * @memberOf fabric.Rect\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created\n */\n fabric.Rect.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Rect', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n toFixed = fabric.util.toFixed;\n\n if (fabric.Polyline) {\n fabric.warn('fabric.Polyline is already defined');\n return;\n }\n\n /**\n * Polyline class\n * @class fabric.Polyline\n * @extends fabric.Object\n * @see {@link fabric.Polyline#initialize} for constructor definition\n */\n fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polyline',\n\n /**\n * Points array\n * @type Array\n * @default\n */\n points: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'),\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {fabric.Polyline} thisArg\n * @example\n * var poly = new fabric.Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n initialize: function(points, options) {\n options = options || {};\n this.points = points || [];\n this.callSuper('initialize', options);\n this._setPositionDimensions(options);\n },\n\n _setPositionDimensions: function(options) {\n var calcDim = this._calcDimensions(options), correctLeftTop;\n this.width = calcDim.width;\n this.height = calcDim.height;\n if (!options.fromSVG) {\n correctLeftTop = this.translateToGivenOrigin(\n { x: calcDim.left - this.strokeWidth / 2, y: calcDim.top - this.strokeWidth / 2 },\n 'left',\n 'top',\n this.originX,\n this.originY\n );\n }\n if (typeof options.left === 'undefined') {\n this.left = options.fromSVG ? calcDim.left : correctLeftTop.x;\n }\n if (typeof options.top === 'undefined') {\n this.top = options.fromSVG ? calcDim.top : correctLeftTop.y;\n }\n this.pathOffset = {\n x: calcDim.left + this.width / 2,\n y: calcDim.top + this.height / 2\n };\n },\n\n /**\n * Calculate the polygon min and max point from points array,\n * returning an object with left, top, widht, height to measure the\n * polygon size\n * @return {Object} object.left X coordinate of the polygon leftmost point\n * @return {Object} object.top Y coordinate of the polygon topmost point\n * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point\n * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point\n * @private\n */\n _calcDimensions: function() {\n\n var points = this.points,\n minX = min(points, 'x') || 0,\n minY = min(points, 'y') || 0,\n maxX = max(points, 'x') || 0,\n maxY = max(points, 'y') || 0,\n width = (maxX - minX),\n height = (maxY - minY);\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n points: this.points.concat()\n });\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n for (var i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' '\n );\n }\n return [\n '<' + this.type + ' ', 'COMMON_PARTS',\n 'points=\"', points.join(''),\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n commonRender: function(ctx) {\n var point, len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return false;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (var i = 0; i < len; i++) {\n point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n return true;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var p1, p2;\n\n ctx.beginPath();\n for (var i = 0, len = this.points.length; i < len; i++) {\n p1 = this.points[i];\n p2 = this.points[i + 1] || p1;\n fabric.util.drawDashedLine(ctx, p1.x, p1.y, p2.x, p2.y, this.strokeDashArray);\n }\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.get('points').length;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement})\n * @static\n * @memberOf fabric.Polyline\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns fabric.Polyline instance from an SVG element\n * @static\n * @memberOf fabric.Polyline\n * @param {SVGElement} element Element to parser\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polyline.fromElementGenerator = function(_class) {\n return function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options || (options = { });\n\n var points = fabric.parsePointsAttribute(element.getAttribute('points')),\n parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric[_class](points, extend(parsedAttributes, options)));\n };\n };\n\n fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline');\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polyline instance from an object representation\n * @static\n * @memberOf fabric.Polyline\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polyline.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polyline', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Polygon) {\n fabric.warn('fabric.Polygon is already defined');\n return;\n }\n\n /**\n * Polygon class\n * @class fabric.Polygon\n * @extends fabric.Polyline\n * @see {@link fabric.Polygon#initialize} for constructor definition\n */\n fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polygon',\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n ctx.closePath();\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n this.callSuper('_renderDashedStroke', ctx);\n ctx.closePath();\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`)\n * @static\n * @memberOf fabric.Polygon\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement\n */\n fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns {@link fabric.Polygon} instance from an SVG element\n * @static\n * @memberOf fabric.Polygon\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon');\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polygon instance from an object representation\n * @static\n * @memberOf fabric.Polygon\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polygon.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polygon', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n extend = fabric.util.object.extend,\n _toString = Object.prototype.toString,\n drawArc = fabric.util.drawArc,\n toFixed = fabric.util.toFixed,\n commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7\n },\n repeatedCommands = {\n m: 'l',\n M: 'L'\n };\n\n if (fabric.Path) {\n fabric.warn('fabric.Path is already defined');\n return;\n }\n\n /**\n * Path class\n * @class fabric.Path\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup}\n * @see {@link fabric.Path#initialize} for constructor definition\n */\n fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'path',\n\n /**\n * Array of path points\n * @type Array\n * @default\n */\n path: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'),\n\n stateProperties: fabric.Object.prototype.stateProperties.concat('path'),\n\n /**\n * Constructor\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n * @return {fabric.Path} thisArg\n */\n initialize: function(path, options) {\n options = options || { };\n this.callSuper('initialize', options);\n\n if (!path) {\n path = [];\n }\n\n var fromArray = _toString.call(path) === '[object Array]';\n\n this.path = fromArray\n ? path\n // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)\n : path.match && path.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);\n\n if (!this.path) {\n return;\n }\n\n if (!fromArray) {\n this.path = this._parsePath();\n }\n\n fabric.Polyline.prototype._setPositionDimensions.call(this, options);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands: function(ctx) {\n var current, // current instruction\n previous = null,\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n tempX,\n tempY,\n l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'l': // lineto, relative\n x += current[1];\n y += current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'h': // horizontal lineto, relative\n x += current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'H': // horizontal lineto, absolute\n x = current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'v': // vertical lineto, relative\n y += current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'V': // verical lineto, absolute\n y = current[1];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'm': // moveTo, relative\n x += current[1];\n y += current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'c': // bezierCurveTo, relative\n tempX = x + current[5];\n tempY = y + current[6];\n controlX = x + current[3];\n controlY = y + current[4];\n ctx.bezierCurveTo(\n x + current[1] + l, // x1\n y + current[2] + t, // y1\n controlX + l, // x2\n controlY + t, // y2\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'C': // bezierCurveTo, absolute\n x = current[5];\n y = current[6];\n controlX = current[3];\n controlY = current[4];\n ctx.bezierCurveTo(\n current[1] + l,\n current[2] + t,\n controlX + l,\n controlY + t,\n x + l,\n y + t\n );\n break;\n\n case 's': // shorthand cubic bezierCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n ctx.bezierCurveTo(\n controlX + l,\n controlY + t,\n x + current[1] + l,\n y + current[2] + t,\n tempX + l,\n tempY + t\n );\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = x + current[1];\n controlY = y + current[2];\n\n x = tempX;\n y = tempY;\n break;\n\n case 'S': // shorthand cubic bezierCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n ctx.bezierCurveTo(\n controlX + l,\n controlY + t,\n current[1] + l,\n current[2] + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = current[1];\n controlY = current[2];\n\n break;\n\n case 'q': // quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n controlX = x + current[1];\n controlY = y + current[2];\n\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n\n ctx.quadraticCurveTo(\n current[1] + l,\n current[2] + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 't': // shorthand quadraticCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[1];\n tempY = y + current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n\n break;\n\n case 'T':\n tempX = current[1];\n tempY = current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n ctx.quadraticCurveTo(\n controlX + l,\n controlY + t,\n tempX + l,\n tempY + t\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'a':\n // TODO: optimize this\n drawArc(ctx, x + l, y + t, [\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + x + l,\n current[7] + y + t\n ]);\n x += current[6];\n y += current[7];\n break;\n\n case 'A':\n // TODO: optimize this\n drawArc(ctx, x + l, y + t, [\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + l,\n current[7] + t\n ]);\n x = current[6];\n y = current[7];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n ctx.closePath();\n break;\n }\n previous = current;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render: function(ctx) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n path: this.path.map(function(item) { return item.slice(); }),\n });\n },\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var o = this.toObject(['sourcePath'].concat(propertiesToInclude));\n if (o.sourcePath) {\n delete o.path;\n }\n return o;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var path = this.path.map(function(path) {\n return path.join(' ');\n }).join(' ');\n return [\n '\\n'\n ];\n },\n\n _getOffsetTransform: function() {\n var digits = fabric.Object.NUM_FRACTION_DIGITS;\n return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' +\n toFixed(-this.pathOffset.y, digits) + ')';\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return '\\t' + this._createBaseClipPathSVGMarkup(\n this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }\n );\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform });\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns number representation of an instance complexity\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.path.length;\n },\n\n /**\n * @private\n */\n _parsePath: function() {\n var result = [],\n coords = [],\n currentPath,\n parsed,\n re = /([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:e[-+]?\\d+)?)/ig,\n match,\n coordsStr;\n\n for (var i = 0, coordsParsed, len = this.path.length; i < len; i++) {\n currentPath = this.path[i];\n\n coordsStr = currentPath.slice(1).trim();\n coords.length = 0;\n\n while ((match = re.exec(coordsStr))) {\n coords.push(match[0]);\n }\n\n coordsParsed = [currentPath.charAt(0)];\n\n for (var j = 0, jlen = coords.length; j < jlen; j++) {\n parsed = parseFloat(coords[j]);\n if (!isNaN(parsed)) {\n coordsParsed.push(parsed);\n }\n }\n\n var command = coordsParsed[0],\n commandLength = commandLengths[command.toLowerCase()],\n repeatedCommand = repeatedCommands[command] || command;\n\n if (coordsParsed.length - 1 > commandLength) {\n for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {\n result.push([command].concat(coordsParsed.slice(k, k + commandLength)));\n command = repeatedCommand;\n }\n }\n else {\n result.push(coordsParsed);\n }\n }\n\n return result;\n },\n\n /**\n * @private\n */\n _calcDimensions: function() {\n\n var aX = [],\n aY = [],\n current, // current instruction\n previous = null,\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n tempX,\n tempY,\n bounds;\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'l': // lineto, relative\n x += current[1];\n y += current[2];\n bounds = [];\n break;\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n bounds = [];\n break;\n\n case 'h': // horizontal lineto, relative\n x += current[1];\n bounds = [];\n break;\n\n case 'H': // horizontal lineto, absolute\n x = current[1];\n bounds = [];\n break;\n\n case 'v': // vertical lineto, relative\n y += current[1];\n bounds = [];\n break;\n\n case 'V': // verical lineto, absolute\n y = current[1];\n bounds = [];\n break;\n\n case 'm': // moveTo, relative\n x += current[1];\n y += current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'c': // bezierCurveTo, relative\n tempX = x + current[5];\n tempY = y + current[6];\n controlX = x + current[3];\n controlY = y + current[4];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n x + current[1], // x1\n y + current[2], // y1\n controlX, // x2\n controlY, // y2\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'C': // bezierCurveTo, absolute\n controlX = current[3];\n controlY = current[4];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n controlX,\n controlY,\n current[5],\n current[6]\n );\n x = current[5];\n y = current[6];\n break;\n\n case 's': // shorthand cubic bezierCurveTo, relative\n\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n x + current[1],\n y + current[2],\n tempX,\n tempY\n );\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = x + current[1];\n controlY = y + current[2];\n x = tempX;\n y = tempY;\n break;\n\n case 'S': // shorthand cubic bezierCurveTo, absolute\n tempX = current[3];\n tempY = current[4];\n if (previous[0].match(/[CcSs]/) === null) {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n current[1],\n current[2],\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n // set control point to 2nd one of this command\n // \"... the first control point is assumed to be\n // the reflection of the second control point on\n // the previous command relative to the current point.\"\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 'q': // quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[3];\n tempY = y + current[4];\n controlX = x + current[1];\n controlY = y + current[2];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n controlX = current[1];\n controlY = current[2];\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n current[3],\n current[4]\n );\n x = current[3];\n y = current[4];\n break;\n\n case 't': // shorthand quadraticCurveTo, relative\n // transform to absolute x,y\n tempX = x + current[1];\n tempY = y + current[2];\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n\n break;\n\n case 'T':\n tempX = current[1];\n tempY = current[2];\n\n if (previous[0].match(/[QqTt]/) === null) {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n else {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n bounds = fabric.util.getBoundsOfCurve(x, y,\n controlX,\n controlY,\n controlX,\n controlY,\n tempX,\n tempY\n );\n x = tempX;\n y = tempY;\n break;\n\n case 'a':\n // TODO: optimize this\n bounds = fabric.util.getBoundsOfArc(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6] + x,\n current[7] + y\n );\n x += current[6];\n y += current[7];\n break;\n\n case 'A':\n // TODO: optimize this\n bounds = fabric.util.getBoundsOfArc(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6],\n current[7]\n );\n x = current[6];\n y = current[7];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n previous = current;\n bounds.forEach(function (point) {\n aX.push(point.x);\n aY.push(point.y);\n });\n aX.push(x);\n aY.push(y);\n }\n\n var minX = min(aX) || 0,\n minY = min(aY) || 0,\n maxX = max(aX) || 0,\n maxY = max(aY) || 0,\n deltaX = maxX - minX,\n deltaY = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: deltaX,\n height: deltaY\n };\n }\n });\n\n /**\n * Creates an instance of fabric.Path from an object\n * @static\n * @memberOf fabric.Path\n * @param {Object} object\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Path.fromObject = function(object, callback) {\n if (typeof object.sourcePath === 'string') {\n var pathUrl = object.sourcePath;\n fabric.loadSVGFromURL(pathUrl, function (elements) {\n var path = elements[0];\n path.setOptions(object);\n callback && callback(path);\n });\n }\n else {\n fabric.Object._fromObject('Path', object, callback, 'path');\n }\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`)\n * @static\n * @memberOf fabric.Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']);\n\n /**\n * Creates an instance of fabric.Path from an SVG element\n * @static\n * @memberOf fabric.Path\n * @param {SVGElement} element to parse\n * @param {Function} callback Callback to invoke when an fabric.Path instance is created\n * @param {Object} [options] Options object\n * @param {Function} [callback] Options callback invoked after parsing is finished\n */\n fabric.Path.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max;\n\n if (fabric.Group) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.Group\n * @extends fabric.Object\n * @mixes fabric.Collection\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.Group#initialize} for constructor definition\n */\n fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'group',\n\n /**\n * Width of stroke\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * Indicates if click events should also check for subtargets\n * @type Boolean\n * @default\n */\n subTargetCheck: false,\n\n /**\n * Groups are container, do not render anything on theyr own, ence no cache properties\n * @type Array\n * @default\n */\n cacheProperties: [],\n\n /**\n * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still\n * available setting this boolean to true.\n * @type Boolean\n * @since 2.0.0\n * @default\n */\n useSetOnGroup: false,\n\n /**\n * Constructor\n * @param {Object} objects Group objects\n * @param {Object} [options] Options object\n * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already.\n * @return {Object} thisArg\n */\n initialize: function(objects, options, isAlreadyGrouped) {\n options = options || {};\n this._objects = [];\n // if objects enclosed in a group have been grouped already,\n // we cannot change properties of objects.\n // Thus we need to set options to group without objects,\n isAlreadyGrouped && this.callSuper('initialize', options);\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (!isAlreadyGrouped) {\n var center = options && options.centerPoint;\n // we want to set origins before calculating the bounding box.\n // so that the topleft can be set with that in mind.\n // if specific top and left are passed, are overwritten later\n // with the callSuper('initialize', options)\n if (options.originX !== undefined) {\n this.originX = options.originX;\n }\n if (options.originY !== undefined) {\n this.originY = options.originY;\n }\n // if coming from svg i do not want to calc bounds.\n // i assume width and height are passed along options\n center || this._calcBounds();\n this._updateObjectsCoords(center);\n delete options.centerPoint;\n this.callSuper('initialize', options);\n }\n else {\n this._updateObjectsACoords();\n }\n\n this.setCoords();\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsACoords: function() {\n var ignoreZoom = true, skipAbsolute = true;\n for (var i = this._objects.length; i--; ){\n this._objects[i].setCoords(ignoreZoom, skipAbsolute);\n }\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsCoords: function(center) {\n var center = center || this.getCenterPoint();\n for (var i = this._objects.length; i--; ){\n this._updateObjectCoords(this._objects[i], center);\n }\n },\n\n /**\n * @private\n * @param {Object} object\n * @param {fabric.Point} center, current center of group.\n */\n _updateObjectCoords: function(object, center) {\n var objectLeft = object.left,\n objectTop = object.top,\n ignoreZoom = true, skipAbsolute = true;\n\n object.set({\n left: objectLeft - center.x,\n top: objectTop - center.y\n });\n object.group = this;\n object.setCoords(ignoreZoom, skipAbsolute);\n },\n\n /**\n * Returns string represenation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Adds an object to a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n addWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n if (object) {\n this._objects.push(object);\n object.group = this;\n object._set('canvas', this.canvas);\n }\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * Removes an object from a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n removeWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n\n this.remove(object);\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * @private\n */\n _onObjectAdded: function(object) {\n this.dirty = true;\n object.group = this;\n object._set('canvas', this.canvas);\n },\n\n /**\n * @private\n */\n _onObjectRemoved: function(object) {\n this.dirty = true;\n delete object.group;\n },\n\n /**\n * @private\n */\n _set: function(key, value) {\n var i = this._objects.length;\n if (this.useSetOnGroup) {\n while (i--) {\n this._objects[i].setOnGroup(key, value);\n }\n }\n if (key === 'canvas') {\n while (i--) {\n this._objects[i]._set(key, value);\n }\n }\n fabric.Object.prototype._set.call(this, key, value);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var _includeDefaultValues = this.includeDefaultValues;\n var objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Returns object representation of an instance, in dataless mode.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var objsToObject, sourcePath = this.sourcePath;\n if (sourcePath) {\n objsToObject = sourcePath;\n }\n else {\n var _includeDefaultValues = this.includeDefaultValues;\n objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toDatalessObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n }\n var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render: function(ctx) {\n this._transformDone = true;\n this.callSuper('render', ctx);\n this._transformDone = false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n var ownCache = fabric.Object.prototype.shouldCache.call(this);\n if (ownCache) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow: function() {\n if (this.shadow) {\n return fabric.Object.prototype.willDrawShadow.call(this);\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return this.ownCaching || (this.group && this.group.isOnACache());\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i].render(ctx);\n }\n this._drawClipPath(ctx);\n },\n\n /**\n * Check if cache is dirty\n */\n isCacheDirty: function(skipCanvas) {\n if (this.callSuper('isCacheDirty', skipCanvas)) {\n return true;\n }\n if (!this.statefullCache) {\n return false;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].isCacheDirty(true)) {\n if (this._cacheCanvas) {\n // if this group has not a cache canvas there is nothing to clean\n var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-x / 2, -y / 2, x, y);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Retores original state of each of group objects (original state is that which was before group was created).\n * @private\n * @return {fabric.Group} thisArg\n * @chainable\n */\n _restoreObjectsState: function() {\n this._objects.forEach(this._restoreObjectState, this);\n return this;\n },\n\n /**\n * Realises the transform from this group onto the supplied object\n * i.e. it tells you what would happen if the supplied object was in\n * the group, and then the group was destroyed. It mutates the supplied\n * object.\n * @param {fabric.Object} object\n * @return {fabric.Object} transformedObject\n */\n realizeTransform: function(object) {\n var matrix = object.calcTransformMatrix(),\n options = fabric.util.qrDecompose(matrix),\n center = new fabric.Point(options.translateX, options.translateY);\n object.flipX = false;\n object.flipY = false;\n object.set('scaleX', options.scaleX);\n object.set('scaleY', options.scaleY);\n object.skewX = options.skewX;\n object.skewY = options.skewY;\n object.angle = options.angle;\n object.setPositionByOrigin(center, 'center', 'center');\n return object;\n },\n\n /**\n * Restores original state of a specified object in group\n * @private\n * @param {fabric.Object} object\n * @return {fabric.Group} thisArg\n */\n _restoreObjectState: function(object) {\n this.realizeTransform(object);\n object.setCoords();\n delete object.group;\n return this;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n destroy: function() {\n // when group is destroyed objects needs to get a repaint to be eventually\n // displayed on canvas.\n this._objects.forEach(function(object) {\n object.set('dirty', true);\n });\n return this._restoreObjectsState();\n },\n\n /**\n * make a group an active selection, remove the group from canvas\n * the group has to be on canvas for this to work.\n * @return {fabric.ActiveSelection} thisArg\n * @chainable\n */\n toActiveSelection: function() {\n if (!this.canvas) {\n return;\n }\n var objects = this._objects, canvas = this.canvas;\n this._objects = [];\n var options = this.toObject();\n delete options.objects;\n var activeSelection = new fabric.ActiveSelection([]);\n activeSelection.set(options);\n activeSelection.type = 'activeSelection';\n canvas.remove(this);\n objects.forEach(function(object) {\n object.group = activeSelection;\n object.dirty = true;\n canvas.add(object);\n });\n activeSelection.canvas = canvas;\n activeSelection._objects = objects;\n canvas._activeObject = activeSelection;\n activeSelection.setCoords();\n return activeSelection;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n ungroupOnCanvas: function() {\n return this._restoreObjectsState();\n },\n\n /**\n * Sets coordinates of all objects inside group\n * @return {fabric.Group} thisArg\n * @chainable\n */\n setObjectsCoords: function() {\n var ignoreZoom = true, skipAbsolute = true;\n this.forEachObject(function(object) {\n object.setCoords(ignoreZoom, skipAbsolute);\n });\n return this;\n },\n\n /**\n * @private\n */\n _calcBounds: function(onlyWidthHeight) {\n var aX = [],\n aY = [],\n o, prop,\n props = ['tr', 'br', 'bl', 'tl'],\n i = 0, iLen = this._objects.length,\n j, jLen = props.length,\n ignoreZoom = true;\n\n for ( ; i < iLen; ++i) {\n o = this._objects[i];\n o.setCoords(ignoreZoom);\n for (j = 0; j < jLen; j++) {\n prop = props[j];\n aX.push(o.oCoords[prop].x);\n aY.push(o.oCoords[prop].y);\n }\n }\n\n this._getBounds(aX, aY, onlyWidthHeight);\n },\n\n /**\n * @private\n */\n _getBounds: function(aX, aY, onlyWidthHeight) {\n var minXY = new fabric.Point(min(aX), min(aY)),\n maxXY = new fabric.Point(max(aX), max(aY)),\n top = minXY.y || 0, left = minXY.x || 0,\n width = (maxXY.x - minXY.x) || 0,\n height = (maxXY.y - minXY.y) || 0;\n this.width = width;\n this.height = height;\n if (!onlyWidthHeight) {\n // the bounding box always finds the topleft most corner.\n // whatever is the group origin, we set up here the left/top position.\n this.setPositionByOrigin({ x: left, y: top }, 'left', 'top');\n }\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function(reviver) {\n var svgString = ['\\n'];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n },\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles: function() {\n var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ?\n 'opacity: ' + this.opacity + ';' : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [\n opacity,\n this.getSvgFilter(),\n visibility\n ].join('');\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var svgString = [];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n\n return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver });\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Group} instance from an object representation\n * @static\n * @memberOf fabric.Group\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an group instance is created\n */\n fabric.Group.fromObject = function(object, callback) {\n fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n fabric.util.enlivenObjects([object.clipPath], function(enlivedClipPath) {\n var options = fabric.util.object.clone(object, true);\n options.clipPath = enlivedClipPath[0];\n delete options.objects;\n callback && callback(new fabric.Group(enlivenedObjects, options, true));\n });\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.ActiveSelection) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.ActiveSelection\n * @extends fabric.Group\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.ActiveSelection#initialize} for constructor definition\n */\n fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'activeSelection',\n\n /**\n * Constructor\n * @param {Object} objects ActiveSelection objects\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(objects, options) {\n options = options || {};\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (options.originX) {\n this.originX = options.originX;\n }\n if (options.originY) {\n this.originY = options.originY;\n }\n this._calcBounds();\n this._updateObjectsCoords();\n fabric.Object.prototype.initialize.call(this, options);\n this.setCoords();\n },\n\n /**\n * Change te activeSelection to a normal group,\n * High level function that automatically adds it to canvas as\n * active object. no events fired.\n * @since 2.0.0\n * @return {fabric.Group}\n */\n toGroup: function() {\n var objects = this._objects.concat();\n this._objects = [];\n var options = fabric.Object.prototype.toObject.call(this);\n var newGroup = new fabric.Group([]);\n delete options.type;\n newGroup.set(options);\n objects.forEach(function(object) {\n object.canvas.remove(object);\n object.group = newGroup;\n });\n newGroup._objects = objects;\n if (!this.canvas) {\n return newGroup;\n }\n var canvas = this.canvas;\n canvas.add(newGroup);\n canvas._activeObject = newGroup;\n newGroup.setCoords();\n return newGroup;\n },\n\n /**\n * If returns true, deselection is cancelled.\n * @since 2.0.0\n * @return {Boolean} [cancel]\n */\n onDeselect: function() {\n this.destroy();\n return false;\n },\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return false;\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls: function(ctx, styleOverride, childrenOverride) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n this.callSuper('_renderControls', ctx, styleOverride);\n childrenOverride = childrenOverride || { };\n if (typeof childrenOverride.hasControls === 'undefined') {\n childrenOverride.hasControls = false;\n }\n if (typeof childrenOverride.hasRotatingPoint === 'undefined') {\n childrenOverride.hasRotatingPoint = false;\n }\n childrenOverride.forActiveSelection = true;\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i]._renderControls(ctx, childrenOverride);\n }\n ctx.restore();\n },\n });\n\n /**\n * Returns {@link fabric.ActiveSelection} instance from an object representation\n * @static\n * @memberOf fabric.ActiveSelection\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created\n */\n fabric.ActiveSelection.fromObject = function(object, callback) {\n fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n delete object.objects;\n callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var extend = fabric.util.object.extend;\n\n if (!global.fabric) {\n global.fabric = { };\n }\n\n if (global.fabric.Image) {\n fabric.warn('fabric.Image is already defined.');\n return;\n }\n\n /**\n * Image class\n * @class fabric.Image\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n * @see {@link fabric.Image#initialize} for constructor definition\n */\n fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'image',\n\n /**\n * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @type String\n * @default\n */\n crossOrigin: '',\n\n /**\n * Width of a stroke.\n * For image quality a stroke multiple of 2 gives better results.\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default\n */\n srcFromAttribute: false,\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleX: 1,\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleY: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingX: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingY: 1,\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n minimumScaleTrigger: 0.5,\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'),\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n * @default\n */\n cacheKey: '',\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropX: 0,\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropY: 0,\n\n /**\n * Constructor\n * @param {HTMLImageElement | String} element Image element\n * @param {Object} [options] Options object\n * @param {function} [callback] callback function to call after eventual filters applied.\n * @return {fabric.Image} thisArg\n */\n initialize: function(element, options) {\n options || (options = { });\n this.filters = [];\n this.cacheKey = 'texture' + fabric.Object.__uid++;\n this.callSuper('initialize', options);\n this._initElement(element, options);\n },\n\n /**\n * Returns image element which this instance if based on\n * @return {HTMLImageElement} Image element\n */\n getElement: function() {\n return this._element || {};\n },\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setElement: function(element, options) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._element = element;\n this._originalElement = element;\n this._initConfig(options);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal fiters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n return this;\n },\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture: function(key) {\n var backend = fabric.filterBackend;\n if (backend && backend.evictCachesForKey) {\n backend.evictCachesForKey(key);\n }\n },\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose: function() {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._cacheContext = undefined;\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n },\n\n /**\n * Sets crossOrigin value (on an instance and corresponding image element)\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setCrossOrigin: function(value) {\n this.crossOrigin = value;\n this._element.crossOrigin = value;\n\n return this;\n },\n\n /**\n * Returns original size of an image\n * @return {Object} Object with \"width\" and \"height\" properties\n */\n getOriginalSize: function() {\n var element = this.getElement();\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height\n };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n var w = this.width / 2, h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderDashedStroke: function(ctx) {\n var x = -this.width / 2,\n y = -this.height / 2,\n w = this.width,\n h = this.height;\n\n ctx.save();\n this._setStrokeStyles(ctx, this);\n\n ctx.beginPath();\n fabric.util.drawDashedLine(ctx, x, y, x + w, y, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y, x + w, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x + w, y + h, x, y + h, this.strokeDashArray);\n fabric.util.drawDashedLine(ctx, x, y + h, x, y, this.strokeDashArray);\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var filters = [];\n\n this.filters.forEach(function(filterObj) {\n if (filterObj) {\n filters.push(filterObj.toObject());\n }\n });\n var object = extend(\n this.callSuper(\n 'toObject',\n ['crossOrigin', 'cropX', 'cropY'].concat(propertiesToInclude)\n ), {\n src: this.getSrc(),\n filters: filters,\n });\n if (this.resizeFilter) {\n object.resizeFilter = this.resizeFilter.toObject();\n }\n return object;\n },\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,hight.\n * @return {Boolean}\n */\n hasCrop: function() {\n return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString = [], imageMarkup = [], strokeSvg,\n x = -this.width / 2, y = -this.height / 2, clipPath = '';\n if (this.hasCrop()) {\n var clipPathId = fabric.Object.__uid++;\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n'\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n imageMarkup.push('\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n '\" width=\"', this._element.width || this._element.naturalWidth,\n '\" height=\"', this._element.height || this._element.height,\n '\"', clipPath,\n '>\\n');\n\n if (this.stroke || this.strokeDashArray) {\n var origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n '\\t\\n'\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== 'fill') {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n }\n else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc: function(filtered) {\n var element = filtered ? this._element : this._originalElement;\n if (element) {\n if (element.toDataURL) {\n return element.toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src');\n }\n else {\n return element.src;\n }\n }\n else {\n return this.src || '';\n }\n },\n\n /**\n * Sets source of an image\n * @param {String} src Source string (URL)\n * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied)\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setSrc: function(src, callback, options) {\n fabric.util.loadImage(src, function(img) {\n this.setElement(img, options);\n this._setWidthHeight();\n callback && callback(this);\n }, this, options && options.crossOrigin);\n return this;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n applyResizeFilters: function() {\n var filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.scaleX,\n scaleY = objectScale.scaleY,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n var canvasEl = fabric.util.createCanvasElement(),\n cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey,\n sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height;\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n fabric.filterBackend.applyFilters(\n [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey);\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n },\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n * @return {thisArg} return the fabric.Image object\n * @chainable\n */\n applyFilters: function(filters) {\n\n filters = filters || this.filters || [];\n filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); });\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(this.cacheKey + '_filtered');\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n this._filteredEl = null;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return this;\n }\n\n var imgElement = this._originalElement,\n sourceWidth = imgElement.naturalWidth || imgElement.width,\n sourceHeight = imgElement.naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the element is the same we need to create a new element\n var canvasEl = fabric.util.createCanvasElement();\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n }\n else {\n // clear the existing element to get new filter data\n // also dereference the eventual resized _element\n this._element = this._filteredEl;\n this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n fabric.filterBackend.applyFilters(\n filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey);\n if (this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY = this._element.height / this._originalElement.height;\n }\n return this;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache: function() {\n return this.needsItsOwnCache();\n },\n\n _renderFill: function(ctx) {\n var elementToDraw = this._element,\n w = this.width, h = this.height,\n sW = Math.min(elementToDraw.naturalWidth || elementToDraw.width, w * this._filterScalingX),\n sH = Math.min(elementToDraw.naturalHeight || elementToDraw.height, h * this._filterScalingY),\n x = -w / 2, y = -h / 2,\n sX = Math.max(0, this.cropX * this._filterScalingX),\n sY = Math.max(0, this.cropY * this._filterScalingY);\n\n elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, w, h);\n },\n\n /**\n * @private, needed to check if image needs resize\n */\n _needsResize: function() {\n var scale = this.getTotalObjectScaling();\n return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY);\n },\n\n /**\n * @private\n */\n _resetWidthHeight: function() {\n this.set(this.getOriginalSize());\n },\n\n /**\n * The Image class's initialization method. This method is automatically\n * called by the constructor.\n * @private\n * @param {HTMLImageElement|String} element The element representing the image\n * @param {Object} [options] Options object\n */\n _initElement: function(element, options) {\n this.setElement(fabric.util.getById(element), options);\n fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS);\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initConfig: function(options) {\n options || (options = { });\n this.setOptions(options);\n this._setWidthHeight(options);\n if (this._element && this.crossOrigin) {\n this._element.crossOrigin = this.crossOrigin;\n }\n },\n\n /**\n * @private\n * @param {Array} filters to be initialized\n * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created\n */\n _initFilters: function(filters, callback) {\n if (filters && filters.length) {\n fabric.util.enlivenObjects(filters, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, 'fabric.Image.filters');\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n * @param {Object} [options] Object with width/height properties\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n var el = this.getElement();\n this.width = options.width || el.naturalWidth || el.width || 0;\n this.height = options.height || el.naturalHeight || el.height || 0;\n },\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n * @return {Object}\n */\n parsePreserveAspectRatioAttribute: function() {\n var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''),\n rWidth = this._element.width, rHeight = this._element.height,\n scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0,\n offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight };\n if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n }\n else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX: scaleX,\n scaleY: scaleY,\n offsetLeft: offsetLeft,\n offsetTop: offsetTop,\n cropX: cropX,\n cropY: cropY\n };\n }\n });\n\n /**\n * Default CSS class name for canvas\n * @static\n * @type String\n * @default\n */\n fabric.Image.CSS_CANVAS = 'canvas-img';\n\n /**\n * Alias for getSrc\n * @static\n */\n fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc;\n\n /**\n * Creates an instance of fabric.Image from its object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} callback Callback to invoke when an image instance is created\n */\n fabric.Image.fromObject = function(_object, callback) {\n var object = fabric.util.object.clone(_object);\n fabric.util.loadImage(object.src, function(img, error) {\n if (error) {\n callback && callback(null, error);\n return;\n }\n fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) {\n object.filters = filters || [];\n fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) {\n object.resizeFilter = resizeFilters[0];\n fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) {\n object.clipPath = enlivedProps[0];\n var image = new fabric.Image(img, object);\n callback(image);\n });\n });\n });\n }, null, object.crossOrigin);\n };\n\n /**\n * Creates an instance of fabric.Image from an URL string\n * @static\n * @param {String} url URL to create an image from\n * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument)\n * @param {Object} [imgOptions] Options object\n */\n fabric.Image.fromURL = function(url, callback, imgOptions) {\n fabric.util.loadImage(url, function(img) {\n callback && callback(new fabric.Image(img, imgOptions));\n }, null, imgOptions && imgOptions.crossOrigin);\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement})\n * @static\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n fabric.Image.ATTRIBUTE_NAMES =\n fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio xlink:href crossOrigin'.split(' '));\n\n /**\n * Returns {@link fabric.Image} instance from an SVG element\n * @static\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} callback Callback to execute when fabric.Image object is created\n * @return {fabric.Image} Instance of fabric.Image\n */\n fabric.Image.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES);\n fabric.Image.fromURL(parsedAttributes['xlink:href'], callback,\n extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * @private\n * @return {Number} angle value\n */\n _getAngleValueForStraighten: function() {\n var angle = this.angle % 360;\n if (angle > 0) {\n return Math.round((angle - 1) / 90) * 90;\n }\n return Math.round(angle / 90) * 90;\n },\n\n /**\n * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n straighten: function() {\n this.rotate(this._getAngleValueForStraighten());\n return this;\n },\n\n /**\n * Same as {@link fabric.Object.prototype.straighten} but with animation\n * @param {Object} callbacks Object with callback functions\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Object} thisArg\n * @chainable\n */\n fxStraighten: function(callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n fabric.util.animate({\n startValue: this.get('angle'),\n endValue: this._getAngleValueForStraighten(),\n duration: this.FX_DURATION,\n onChange: function(value) {\n _this.rotate(value);\n onChange();\n },\n onComplete: function() {\n _this.setCoords();\n onComplete();\n },\n });\n\n return this;\n }\n});\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Straightens object, then rerenders canvas\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n straightenObject: function (object) {\n object.straighten();\n this.requestRenderAll();\n return this;\n },\n\n /**\n * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n fxStraightenObject: function (object) {\n object.fxStraighten({\n onChange: this.requestRenderAllBound\n });\n return this;\n }\n});\n\n\n(function() {\n\n 'use strict';\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp'\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n function testPrecision(gl, precision){\n var fragmentSource = 'precision ' + precision + ' float;\\nvoid main(){}';\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n return false;\n }\n return true;\n }\n\n /**\n * Indicate whether this filtering backend is supported by the user's browser.\n * @param {Number} tileSize check if the tileSize is supported\n * @returns {Boolean} Whether the user's browser supports WebGL.\n */\n fabric.isWebglSupported = function(tileSize) {\n if (fabric.isLikelyNode) {\n return false;\n }\n tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize;\n var canvas = document.createElement('canvas');\n var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n var isSupported = false;\n // eslint-disable-next-line\n if (gl) {\n fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n isSupported = fabric.maxTextureSize >= tileSize;\n var precisions = ['highp', 'mediump', 'lowp'];\n for (var i = 0; i < 3; i++){\n if (testPrecision(gl, precisions[i])){\n fabric.webGlPrecision = precisions[i];\n break;\n };\n }\n }\n this.isSupported = isSupported;\n return isSupported;\n };\n\n fabric.WebglFilterBackend = WebglFilterBackend;\n\n /**\n * WebGL filter backend.\n */\n function WebglFilterBackend(options) {\n if (options && options.tileSize) {\n this.tileSize = options.tileSize;\n }\n this.setupGLContext(this.tileSize, this.tileSize);\n this.captureGPUInfo();\n };\n\n WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ {\n\n tileSize: 2048,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you problably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext: function(width, height) {\n this.dispose();\n this.createWebGLCanvas(width, height);\n // eslint-disable-next-line\n this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n this.chooseFastestCopyGLTo2DMethod(width, height);\n },\n\n /**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * putImageData is faster than drawImage for that specific operation.\n */\n chooseFastestCopyGLTo2DMethod: function(width, height) {\n var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData;\n try {\n new ImageData(1, 1);\n canUseImageData = true;\n }\n catch (e) {\n canUseImageData = false;\n }\n // eslint-disable-next-line no-undef\n var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined';\n // eslint-disable-next-line no-undef\n var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined';\n\n if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) {\n return;\n }\n\n var targetCanvas = fabric.util.createCanvasElement();\n // eslint-disable-next-line no-undef\n var imageBuffer = new ArrayBuffer(width * height * 4);\n if (fabric.forceGLPutImageData) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n return;\n }\n var testContext = {\n imageBuffer: imageBuffer,\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas\n };\n var startTime, drawImageTime, putImageDataTime;\n targetCanvas.width = width;\n targetCanvas.height = height;\n\n startTime = window.performance.now();\n copyGLTo2DDrawImage.call(testContext, this.gl, testContext);\n drawImageTime = window.performance.now() - startTime;\n\n startTime = window.performance.now();\n copyGLTo2DPutImageData.call(testContext, this.gl, testContext);\n putImageDataTime = window.performance.now() - startTime;\n\n if (drawImageTime > putImageDataTime) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n }\n else {\n this.copyGLTo2D = copyGLTo2DDrawImage;\n }\n },\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas: function(width, height) {\n var canvas = fabric.util.createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n var glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false\n },\n gl = canvas.getContext('webgl', glOptions);\n if (!gl) {\n gl = canvas.getContext('experimental-webgl', glOptions);\n }\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n },\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) {\n var gl = this.gl;\n var cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n var pipelineState = {\n originalWidth: source.width || source.originalWidth,\n originalHeight: source.height || source.originalHeight,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture: cachedTexture ||\n this.createTexture(gl, width, height, !cachedTexture && source),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas\n };\n var tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n },\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose: function() {\n if (this.canvas) {\n this.canvas = null;\n this.gl = null;\n }\n this.clearWebGLCaches();\n },\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches: function() {\n this.programCache = {};\n this.textureCache = {};\n },\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the textuer to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {Number} width The width to initialize the texture at.\n * @param {Number} height The height to initialize the texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.\n * @returns {WebGLTexture}\n */\n createTexture: function(gl, width, height, textureImageSource) {\n var texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource);\n }\n else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n }\n return texture;\n },\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture: function(uniqueId, textureImageSource) {\n if (this.textureCache[uniqueId]) {\n return this.textureCache[uniqueId];\n }\n else {\n var texture = this.createTexture(\n this.gl, textureImageSource.width, textureImageSource.height, textureImageSource);\n this.textureCache[uniqueId] = texture;\n return texture;\n }\n },\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey: function(cacheKey) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n },\n\n copyGLTo2D: copyGLTo2DDrawImage,\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo: function() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n var gl = this.gl, gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n var ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n },\n };\n})();\n\nfunction resizeCanvasIfNeeded(pipelineState) {\n var targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width, height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DDrawImage(gl, pipelineState) {\n var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n var sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0,\n targetCanvas.width, targetCanvas.height);\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DPutImageData(gl, pipelineState) {\n var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n\n // eslint-disable-next-line no-undef\n var u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n // eslint-disable-next-line no-undef\n var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n var imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n}\n\n\n(function() {\n\n 'use strict';\n\n var noop = function() {};\n\n fabric.Canvas2dFilterBackend = Canvas2dFilterBackend;\n\n /**\n * Canvas 2D filter backend.\n */\n function Canvas2dFilterBackend() {};\n\n Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ {\n evictCachesForKey: noop,\n dispose: noop,\n clearWebGLCaches: noop,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) {\n var ctx = targetCanvas.getContext('2d');\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var pipelineState = {\n sourceWidth: sourceWidth,\n sourceHeight: sourceHeight,\n imageData: imageData,\n originalEl: sourceElement,\n originalImageData: originalImageData,\n canvasEl: targetCanvas,\n ctx: ctx,\n filterBackend: this,\n };\n filters.forEach(function(filter) { filter.applyTo(pipelineState); });\n if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) {\n targetCanvas.width = pipelineState.imageData.width;\n targetCanvas.height = pipelineState.imageData.height;\n }\n ctx.putImageData(pipelineState.imageData, 0, 0);\n return pipelineState;\n },\n\n };\n})();\n\n\n/**\n * @namespace fabric.Image.filters\n * @memberOf fabric.Image\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters}\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n */\nfabric.Image = fabric.Image || { };\nfabric.Image.filters = fabric.Image.filters || { };\n\n/**\n * Root filter class from which all filter classes inherit from\n * @class fabric.Image.filters.BaseFilter\n * @memberOf fabric.Image.filters\n */\nfabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'BaseFilter',\n\n /**\n * Array of attributes to send with buffers. do not modify\n * @private\n */\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n fragmentSource: 'precision highp float;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n '}',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Sets filter's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram: function(gl, fragmentSource, vertexSource) {\n fragmentSource = fragmentSource || this.fragmentSource;\n vertexSource = vertexSource || this.vertexSource;\n if (fabric.webGlPrecision !== 'highp'){\n fragmentSource = fragmentSource.replace(\n /precision highp float/g,\n 'precision ' + fabric.webGlPrecision + ' float'\n );\n }\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Vertex shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(vertexShader)\n );\n }\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Fragment shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(fragmentShader)\n );\n }\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Shader link error for \"${this.type}\" ' +\n gl.getProgramInfoLog(program)\n );\n }\n\n var attributeLocations = this.getAttributeLocations(gl, program);\n var uniformLocations = this.getUniformLocations(gl, program) || { };\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n return {\n program: program,\n attributeLocations: attributeLocations,\n uniformLocations: uniformLocations\n };\n },\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations: function(gl, program) {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n },\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations: function (/* gl, program */) {\n // in case i do not need any special uniform i need to return an empty object\n return { };\n },\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData: function(gl, attributeLocations, aPositionData) {\n var attributeLocation = attributeLocations.aPosition;\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n },\n\n _setupFrameBuffer: function(options) {\n var gl = options.context, width, height;\n if (options.passes > 1) {\n width = options.destinationWidth;\n height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(gl, width, height);\n }\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,\n options.targetTexture, 0);\n }\n else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n },\n\n _swapTextures: function(options) {\n options.passes--;\n options.pass++;\n var temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n },\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own verison ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n isNeutralState: function(/* options */) {\n var main = this.mainParameter,\n _class = fabric.Image.filters[this.type].prototype;\n if (main) {\n if (Array.isArray(_class[main])) {\n for (var i = _class[main].length; i--;) {\n if (this[main][i] !== _class[main][i]) {\n return false;\n }\n }\n return true;\n }\n else {\n return _class[main] === this[main];\n }\n }\n else {\n return false;\n }\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n if (!options.programCache.hasOwnProperty(this.type)) {\n options.programCache[this.type] = this.createProgram(options.context);\n }\n return options.programCache[this.type];\n },\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL: function(options) {\n var gl = options.context;\n var shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n }\n else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n },\n\n bindAdditionalTexture: function(gl, texture, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n },\n\n unbindAdditionalTexture: function(gl, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n },\n\n getMainParameter: function() {\n return this[this.mainParameter];\n },\n\n setMainParameter: function(value) {\n this[this.mainParameter] = value;\n },\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData: function(/* gl, uniformLocations */) {\n // Intentionally left blank. Override me in subclasses.\n },\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer: function(options) {\n if (!options.helpLayer) {\n var helpLayer = document.createElement('canvas');\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n var object = { type: this.type }, mainP = this.mainParameter;\n if (mainP) {\n object[mainP] = this[mainP];\n }\n return object;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON: function() {\n // delegate, not alias\n return this.toObject();\n }\n});\n\nfabric.Image.filters.BaseFilter.fromObject = function(object, callback) {\n var filter = new fabric.Image.filters[object.type](object);\n callback && callback(filter);\n return filter;\n};\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Matrix filter class\n * @class fabric.Image.filters.ColorMatrix\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl}\n * @example Kodachrome filter\n * var filter = new fabric.Image.filters.ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'ColorMatrix',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform mat4 uColorMatrix;\\n' +\n 'uniform vec4 uConstants;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color *= uColorMatrix;\\n' +\n 'color += uConstants;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ],\n\n mainParameter: 'matrix',\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, manly for non webgl scenario\n * to save some calculation\n */\n colorsOnly: true,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.matrix = this.matrix.slice(0);\n },\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = data.length,\n m = this.matrix,\n r, g, b, a, i, colorsOnly = this.colorsOnly;\n\n for (i = 0; i < iLen; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n if (colorsOnly) {\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n }\n else {\n a = data[i + 3];\n data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255;\n data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'),\n uConstants: gl.getUniformLocation(program, 'uConstants'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var m = this.matrix,\n matrix = [\n m[0], m[1], m[2], m[3],\n m[5], m[6], m[7], m[8],\n m[10], m[11], m[12], m[13],\n m[15], m[16], m[17], m[18]\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] function to invoke after filter creation\n * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix\n */\n fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Brightness filter class\n * @class fabric.Image.filters.Brightness\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Brightness',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBrightness;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += uBrightness;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n * @default\n */\n brightness: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'brightness',\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.brightness === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n brightness = Math.round(this.brightness * 255);\n for (i = 0; i < len; i += 4) {\n data[i] = data[i] + brightness;\n data[i + 1] = data[i + 1] + brightness;\n data[i + 2] = data[i + 2] + brightness;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBrightness: gl.getUniformLocation(program, 'uBrightness'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness\n */\n fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Adapted from html5rocks article\n * @class fabric.Image.filters.Convolute\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example Sharpen filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * var filter = new fabric.Image.filters.Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Convolute',\n\n /*\n * Opaque value (true/false)\n */\n opaque: false,\n\n /*\n * matrix for the filter, max 9x9\n */\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: {\n Convolute_3_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_3_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_5_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_5_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_7_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_7_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_9_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_9_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n },\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Convolute.prototype\n * @param {Object} [options] Options object\n * @param {Boolean} [options.opaque=false] Opaque value (true/false)\n * @param {Array} [options.matrix] Filter matrix\n */\n\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var size = Math.sqrt(this.matrix.length);\n var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0);\n var shaderSource = this.fragmentSource[cacheKey];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0,\n r, g, b, a, dstOff,\n scx, scy, srcOff, wt,\n x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0; g = 0; b = 0; a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy > sh || scx < 0 || scx > sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n }\n else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMatrix: gl.getUniformLocation(program, 'uMatrix'),\n uOpaque: gl.getUniformLocation(program, 'uOpaque'),\n uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),\n uSize: gl.getUniformLocation(program, 'uSize'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n opaque: this.opaque,\n matrix: this.matrix\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute\n */\n fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Grayscale image filter class\n * @class fabric.Image.filters.Grayscale\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Grayscale',\n\n fragmentSource: {\n average: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (color.r + color.b + color.g) / 3.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, color.a);\\n' +\n '}',\n lightness: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n luminosity: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n },\n\n\n /**\n * Grayscale mode, between 'average', 'lightness', 'luminosity'\n * @param {String} type\n * @default\n */\n mode: 'average',\n\n mainParameter: 'mode',\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length, value,\n mode = this.mode;\n for (i = 0; i < len; i += 4) {\n if (mode === 'average') {\n value = (data[i] + data[i + 1] + data[i + 2]) / 3;\n }\n else if (mode === 'lightness') {\n value = (Math.min(data[i], data[i + 1], data[i + 2]) +\n Math.max(data[i], data[i + 1], data[i + 2])) / 2;\n }\n else if (mode === 'luminosity') {\n value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];\n }\n data[i] = value;\n data[i + 1] = value;\n data[i + 2] = value;\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var shaderSource = this.fragmentSource[this.mode];\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMode: gl.getUniformLocation(program, 'uMode'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n // default average mode.\n var mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n },\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState: function() {\n return false;\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale\n */\n fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Invert filter class\n * @class fabric.Image.filters.Invert\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Invert',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uInvert;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'if (uInvert == 1) {\\n' +\n 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\\n' +\n '} else {\\n' +\n 'gl_FragColor = color;\\n' +\n '}\\n' +\n '}',\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n * @default\n */\n invert: true,\n\n mainParameter: 'invert',\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length;\n for (i = 0; i < len; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n }\n },\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function() {\n return !this.invert;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uInvert: gl.getUniformLocation(program, 'uInvert'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1i(uniformLocations.uInvert, this.invert);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert\n */\n fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Noise filter class\n * @class fabric.Image.filters.Noise\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Noise',\n\n /**\n * Fragment source for the noise program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uStepH;\\n' +\n 'uniform float uNoise;\\n' +\n 'uniform float uSeed;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'float rand(vec2 co, float seed, float vScale) {\\n' +\n 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'noise',\n\n /**\n * Noise value, from\n * @param {Number} noise\n * @default\n */\n noise: 0,\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.noise === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n noise = this.noise, rand;\n\n for (i = 0, len = data.length; i < len; i += 4) {\n\n rand = (0.5 - Math.random()) * noise;\n\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uNoise: gl.getUniformLocation(program, 'uNoise'),\n uSeed: gl.getUniformLocation(program, 'uSeed'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n noise: this.noise\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise\n */\n fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Pixelate filter class\n * @class fabric.Image.filters.Pixelate\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Pixelate',\n\n blocksize: 4,\n\n mainParameter: 'blocksize',\n\n /**\n * Fragment source for the Pixelate program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBlocksize;\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'float blockW = uBlocksize * uStepW;\\n' +\n 'float blockH = uBlocksize * uStepW;\\n' +\n 'int posX = int(vTexCoord.x / blockW);\\n' +\n 'int posY = int(vTexCoord.y / blockH);\\n' +\n 'float fposX = float(posX);\\n' +\n 'float fposY = float(posY);\\n' +\n 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\\n' +\n 'vec4 color = texture2D(uTexture, squareCoords);\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = imageData.height,\n jLen = imageData.width,\n index, i, j, r, g, b, a,\n _i, _j, _iLen, _jLen;\n\n for (i = 0; i < iLen; i += this.blocksize) {\n for (j = 0; j < jLen; j += this.blocksize) {\n\n index = (i * 4) * jLen + (j * 4);\n\n r = data[index];\n g = data[index + 1];\n b = data[index + 2];\n a = data[index + 3];\n\n _iLen = Math.min(i + this.blocksize, iLen);\n _jLen = Math.min(j + this.blocksize, jLen);\n for (_i = i; _i < _iLen; _i++) {\n for (_j = j; _j < _jLen; _j++) {\n index = (_i * 4) * jLen + (_j * 4);\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n },\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState: function() {\n return this.blocksize === 1;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n uStepW: gl.getUniformLocation(program, 'uStepW'),\n uStepH: gl.getUniformLocation(program, 'uStepH'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate\n */\n fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Remove white filter class\n * @class fabric.Image.filters.RemoveColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'RemoveColor',\n\n /**\n * Color to remove, in any format understood by fabric.Color.\n * @param {String} type\n * @default\n */\n color: '#FFFFFF',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uLow;\\n' +\n 'uniform vec4 uHigh;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\\n' +\n 'gl_FragColor.a = 0.0;\\n' +\n '}\\n' +\n '}',\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n distance: 0.02,\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n useAlpha: false,\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.RemoveWhite.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.color=#RRGGBB] Threshold value\n * @param {Number} [options.distance=10] Distance value\n */\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n distance = this.distance * 255,\n r, g, b,\n source = new fabric.Color(this.color).getSource(),\n lowC = [\n source[0] - distance,\n source[1] - distance,\n source[2] - distance,\n ],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n\n for (i = 0; i < data.length; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n if (r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]) {\n data[i + 3] = 0;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uLow: gl.getUniformLocation(program, 'uLow'),\n uHigh: gl.getUniformLocation(program, 'uHigh'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource(),\n distance = parseFloat(this.distance),\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n color: this.color,\n distance: this.distance\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite\n */\n fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n var matrices = {\n Brownie: [\n 0.59970,0.34553,-0.27082,0,0.186,\n -0.03770,0.86095,0.15059,0,-0.1449,\n 0.24113,-0.07441,0.44972,0,-0.02965,\n 0,0,0,1,0\n ],\n Vintage: [\n 0.62793,0.32021,-0.03965,0,0.03784,\n 0.02578,0.64411,0.03259,0,0.02926,\n 0.04660,-0.08512,0.52416,0,0.02023,\n 0,0,0,1,0\n ],\n Kodachrome: [\n 1.12855,-0.39673,-0.03992,0,0.24991,\n -0.16404,1.08352,-0.05498,0,0.09698,\n -0.16786,-0.56034,1.60148,0,0.13972,\n 0,0,0,1,0\n ],\n Technicolor: [\n 1.91252,-0.85453,-0.09155,0,0.04624,\n -0.30878,1.76589,-0.10601,0,-0.27589,\n -0.23110,-0.75018,1.84759,0,0.12137,\n 0,0,0,1,0\n ],\n Polaroid: [\n 1.438,-0.062,-0.062,0,0,\n -0.122,1.378,-0.122,0,0,\n -0.016,-0.016,1.483,0,0,\n 0,0,0,1,0\n ],\n Sepia: [\n 0.393, 0.769, 0.189, 0, 0,\n 0.349, 0.686, 0.168, 0, 0,\n 0.272, 0.534, 0.131, 0, 0,\n 0, 0, 0, 1, 0\n ],\n BlackWhite: [\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 0, 0, 0, 1, 0,\n ]\n };\n\n for (var key in matrices) {\n filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: key,\n\n /**\n * Colormatrix for the effect\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: matrices[key],\n\n /**\n * Lock the matrix export for this kind of static, parameter less filters.\n */\n mainParameter: false,\n /**\n * Lock the colormatrix on the color part, skipping alpha\n */\n colorsOnly: true,\n\n });\n fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject;\n }\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Blend filter class\n * @class fabric.Image.filter.BlendColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ {\n type: 'BlendColor',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n color: '#F95C63',\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend color operation.\n **/\n alpha: 1,\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: 'if (uColor.r < 0.5) {\\n' +\n 'gl_FragColor.r *= 2.0 * uColor.r;\\n' +\n '} else {\\n' +\n 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\\n' +\n '}\\n' +\n 'if (uColor.g < 0.5) {\\n' +\n 'gl_FragColor.g *= 2.0 * uColor.g;\\n' +\n '} else {\\n' +\n 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\\n' +\n '}\\n' +\n 'if (uColor.b < 0.5) {\\n' +\n 'gl_FragColor.b *= 2.0 * uColor.b;\\n' +\n '} else {\\n' +\n 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\\n' +\n '}\\n',\n tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\\n' +\n 'gl_FragColor.rgb += uColor.rgb;\\n',\n },\n\n /**\n * build the fragment source for the filters, joining the common part with\n * the specific one.\n * @param {String} mode the mode of the filter, a key of this.fragmentSource\n * @return {String} the source to be compiled\n * @private\n */\n buildSource: function(mode) {\n return 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'gl_FragColor = color;\\n' +\n 'if (color.a > 0.0) {\\n' +\n this.fragmentSource[mode] +\n '}\\n' +\n '}';\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode, shaderSource;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n shaderSource = this.buildSource(this.mode);\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, iLen = data.length,\n tr, tg, tb,\n r, g, b,\n source, alpha1 = 1 - this.alpha;\n\n source = new fabric.Color(this.color).getSource();\n tr = source[0] * this.alpha;\n tg = source[1] * this.alpha;\n tb = source[2] * this.alpha;\n\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n break;\n case 'screen':\n data[i] = 255 - (255 - r) * (255 - tr) / 255;\n data[i + 1] = 255 - (255 - g) * (255 - tg) / 255;\n data[i + 2] = 255 - (255 - b) * (255 - tb) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'diff':\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255);\n data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255);\n data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255);\n break;\n case 'exclusion':\n data[i] = tr + r - ((2 * tr * r) / 255);\n data[i + 1] = tg + g - ((2 * tg * g) / 255);\n data[i + 2] = tb + b - ((2 * tb * b) / 255);\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColor: gl.getUniformLocation(program, 'uColor'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource();\n source[0] = this.alpha * source[0] / 255;\n source[1] = this.alpha * source[1] / 255;\n source[2] = this.alpha * source[2] / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n color: this.color,\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor\n */\n fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Image Blend filter class\n * @class fabric.Image.filter.BlendImage\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ {\n type: 'BlendImage',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n image: null,\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n alpha: 1,\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'uniform mat3 uTransformMatrix;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.rgba *= color2.rgba;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n mask: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.a = color2.a;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n var shaderSource = this.fragmentSource[this.mode];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n applyToWebGL: function(options) {\n // load texture to blend.\n var gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);\n this.callSuper('applyToWebGL', options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n },\n\n createTexture: function(backend, image) {\n return backend.getCachedTexture(image.cacheKey, image._element);\n },\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix: function() {\n var image = this.image,\n width = image._element.width,\n height = image._element.height;\n return [\n 1 / image.scaleX, 0, 0,\n 0, 1 / image.scaleY, 0,\n -image.left / width, -image.top / height, 1\n ];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n resources = options.filterBackend.resources,\n data = imageData.data, iLen = data.length,\n width = imageData.width,\n height = imageData.height,\n tr, tg, tb, ta,\n r, g, b, a,\n canvas1, context, image = this.image, blendData;\n\n if (!resources.blendImage) {\n resources.blendImage = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blendImage;\n context = canvas1.getContext('2d');\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n }\n else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top);\n context.drawImage(image._element, 0, 0, width, height);\n blendData = context.getImageData(0, 0, width, height).data;\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n a = data[i + 3];\n\n tr = blendData[i];\n tg = blendData[i + 1];\n tb = blendData[i + 2];\n ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n data[i + 3] = a * ta / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n uImage: gl.getUniformLocation(program, 'uImage'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n image: this.image && this.image.toObject(),\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} callback to be invoked after filter creation\n * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage\n */\n fabric.Image.filters.BlendImage.fromObject = function(object, callback) {\n fabric.Image.fromObject(object.image, function(image) {\n var options = fabric.util.object.clone(object);\n options.image = image;\n callback(new fabric.Image.filters.BlendImage(options));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor,\n sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin,\n ceil = Math.ceil,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Resize image filter class\n * @class fabric.Image.filters.Resize\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Resize',\n\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n * @param {String} resizeType\n * @default\n */\n resizeType: 'hermite',\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n * @default\n */\n scaleX: 1,\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n * @default\n */\n scaleY: 1,\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n * @default\n */\n lanczosLobes: 3,\n\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uDelta: gl.getUniformLocation(program, 'uDelta'),\n uTaps: gl.getUniformLocation(program, 'uTaps'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]);\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var fragmentShader = this.generateShader(filterWindow);\n options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader);\n }\n return options.programCache[cacheKey];\n },\n\n getFilterWindow: function() {\n var scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n },\n\n getTaps: function() {\n var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale,\n filterWindow = this.getFilterWindow(), taps = new Array(filterWindow);\n for (var i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n },\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader: function(filterWindow) {\n var offsets = new Array(filterWindow),\n fragmentShader = this.fragmentSourceTOP, filterWindow;\n\n for (var i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = i + '.0 * uDelta';\n }\n\n fragmentShader += 'uniform float uTaps[' + filterWindow + '];\\n';\n fragmentShader += 'void main() {\\n';\n fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\\n';\n fragmentShader += ' float sum = 1.0;\\n';\n\n offsets.forEach(function(offset, i) {\n fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\\n';\n });\n fragmentShader += ' gl_FragColor = color / sum;\\n';\n fragmentShader += '}';\n return fragmentShader;\n },\n\n fragmentSourceTOP: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n',\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceHeight = options.destinationHeight;\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n isNeutralState: function() {\n return this.scaleX === 1 && this.scaleY === 1;\n },\n\n lanczosCreate: function(lobes) {\n return function(x) {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.19209290E-07 && x > -1.19209290E-07) {\n return 1.0;\n }\n x *= Math.PI;\n var xx = x / lobes;\n return (sin(x) / x) * sin(xx) / xx;\n };\n },\n\n /**\n * Applies filter to canvas element\n * @memberOf fabric.Image.filters.Resize.prototype\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} scaleX\n * @param {Number} scaleY\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n var oW = imageData.width, oH = imageData.height,\n dW = round(oW * scaleX), dH = round(oH * scaleY),\n newData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n }\n options.imageData = newData;\n },\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo: function(options, oW, oH, dW, dH) {\n var imageData = options.imageData,\n mult = 0.5, doneW = false, doneH = false, stepW = oW * mult,\n stepH = oH * mult, resources = fabric.filterBackend.resources,\n tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = document.createElement('canvas');\n }\n tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n ctx = tmpCanvas.getContext('2d');\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = floor(dW);\n dH = floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < floor(stepW * mult)) {\n stepW = floor(stepW * mult);\n }\n else {\n stepW = dW;\n doneW = true;\n }\n if (dH < floor(stepH * mult)) {\n stepH = floor(stepH * mult);\n }\n else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n },\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize: function(options, oW, oH, dW, dH) {\n\n function process(u) {\n var v, i, weight, idx, a, red, green,\n blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = floor(center.y);\n a = 0; red = 0; green = 0; blue = 0; alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = floor(1000 * abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = { };\n }\n for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = floor(1000 * abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000);\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n }\n else {\n return destImg;\n }\n }\n\n var srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX, ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY,\n range2X = ceil(ratioX * this.lanczosLobes / 2),\n range2Y = ceil(ratioY * this.lanczosLobes / 2),\n cacheLanc = { }, center = { }, icenter = { };\n\n return process(0);\n },\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering: function(options, oW, oH, dW, dH) {\n var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,\n color, offset = 0, origPix, ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n w4 = 4 * (oW - 1), img = options.imageData,\n pixels = img.data, destImage = options.ctx.createImageData(dW, dH),\n destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = floor(ratioX * j);\n y = floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) + d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n },\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize: function(options, oW, oH, dW, dH) {\n var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,\n ratioWHalf = ceil(ratioW / 2),\n ratioHHalf = ceil(ratioH / 2),\n img = options.imageData, data = img.data,\n img2 = options.ctx.createImageData(dW, dH), data2 = img2.data;\n for (var j = 0; j < dH; j++) {\n for (var i = 0; i < dW; i++) {\n var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0,\n gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH;\n for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n var dy = abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW, w0 = dy * dy;\n for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n var dx = abs(centerX - (xx + 0.5)) / ratioWHalf,\n w = sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = weight * data[dx + 3] / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n resizeType: this.resizeType,\n lanczosLobes: this.lanczosLobes\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize\n */\n fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Contrast filter class\n * @class fabric.Image.filters.Contrast\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Contrast({\n * contrast: 40\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Contrast',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uContrast;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\\n' +\n 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n contrast: 0,\n\n mainParameter: 'contrast',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Contrast.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1)\n */\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n if (this.contrast === 0) {\n return;\n }\n var imageData = options.imageData, i, len,\n data = imageData.data, len = data.length,\n contrast = Math.floor(this.contrast * 255),\n contrastF = 259 * (contrast + 255) / (255 * (259 - contrast));\n\n for (i = 0; i < len; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uContrast: gl.getUniformLocation(program, 'uContrast'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast\n */\n fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Saturate filter class\n * @class fabric.Image.filters.Saturation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Saturation({\n * saturation: 100\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Saturation',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uSaturation;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float rgMax = max(color.r, color.g);\\n' +\n 'float rgbMax = max(rgMax, color.b);\\n' +\n 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\\n' +\n 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\\n' +\n 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n saturation: 0,\n\n mainParameter: 'saturation',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Saturate.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.saturate=0] Value to saturate the image (-1...1)\n */\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.saturation === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.saturation, i, max;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n data[i] += max !== data[i] ? (max - data[i]) * adjust : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uSaturation: gl.getUniformLocation(program, 'uSaturation'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate\n */\n fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Blur filter class\n * @class fabric.Image.filters.Blur\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ {\n\n type: 'Blur',\n\n /*\n'gl_FragColor = vec4(0.0);',\n'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;',\n'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;',\n'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;',\n*/\n\n /* eslint-disable max-len */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'const float nSamples = 15.0;\\n' +\n 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\\n' +\n 'float random(vec3 scale) {\\n' +\n /* use the fragment position for a different seed per-pixel */\n 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0.0);\\n' +\n 'float total = 0.0;\\n' +\n 'float offset = random(v3offset);\\n' +\n 'for (float t = -nSamples; t <= nSamples; t++) {\\n' +\n 'float percent = (t + offset - 0.5) / nSamples;\\n' +\n 'float weight = 1.0 - abs(percent);\\n' +\n 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\\n' +\n 'total += weight;\\n' +\n '}\\n' +\n 'gl_FragColor = color / total;\\n' +\n '}',\n /* eslint-enable max-len */\n\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range bewteen 0 and 1.\n */\n blur: 0,\n\n mainParameter: 'blur',\n\n applyTo: function(options) {\n if (options.webgl) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n applyTo2d: function(options) {\n // paint canvasEl with current image data.\n //options.ctx.putImageData(options.imageData, 0, 0);\n options.imageData = this.simpleBlur(options);\n },\n\n simpleBlur: function(options) {\n var resources = options.filterBackend.resources, canvas1, canvas2,\n width = options.imageData.width,\n height = options.imageData.height;\n\n if (!resources.blurLayer1) {\n resources.blurLayer1 = fabric.util.createCanvasElement();\n resources.blurLayer2 = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blurLayer1;\n canvas2 = resources.blurLayer2;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas2.width = canvas1.width = width;\n canvas2.height = canvas1.height = height;\n }\n var ctx1 = canvas1.getContext('2d'),\n ctx2 = canvas2.getContext('2d'),\n nSamples = 15,\n random, percent, j, i,\n blur = this.blur * 0.06 * 0.5;\n\n // load first canvas\n ctx1.putImageData(options.imageData, 0, 0);\n ctx2.clearRect(0, 0, width, height);\n\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * width + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, j, random);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * height + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, random, j);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n options.ctx.drawImage(canvas1, 0, 0);\n var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n ctx1.globalAlpha = 1;\n ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n return newImageData;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n delta: gl.getUniformLocation(program, 'uDelta'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.delta, delta);\n },\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta: function() {\n var blurScale = 1, delta = [0, 0], blur;\n if (this.horizontal) {\n if (this.aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / this.aspectRatio;\n }\n }\n else {\n if (this.aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = this.aspectRatio;\n }\n }\n blur = blurScale * this.blur * 0.12;\n if (this.horizontal) {\n delta[0] = blur;\n }\n else {\n delta[1] = blur;\n }\n return delta;\n },\n });\n\n /**\n * Deserialize a JSON definition of a BlurFilter into a concrete instance.\n */\n filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Gamma filter class\n * @class fabric.Image.filters.Gamma\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Gamma({\n * brightness: 200\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Gamma',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec3 uGamma;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec3 correction = (1.0 / uGamma);\\n' +\n 'color.r = pow(color.r, correction.r);\\n' +\n 'color.g = pow(color.g, correction.g);\\n' +\n 'color.b = pow(color.b, correction.b);\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.rgb *= color.a;\\n' +\n '}',\n\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n * @default\n */\n gamma: [1, 1, 1],\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'gamma',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.gamma = [1, 1, 1];\n filters.BaseFilter.prototype.initialize.call(this, options);\n },\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData, data = imageData.data,\n gamma = this.gamma, len = data.length,\n rInv = 1 / gamma[0], gInv = 1 / gamma[1],\n bInv = 1 / gamma[2], i;\n\n if (!this.rVals) {\n // eslint-disable-next-line\n this.rVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.gVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.bVals = new Uint8Array(256);\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n for (i = 0, len = 256; i < len; i++) {\n this.rVals[i] = Math.pow(i / 255, rInv) * 255;\n this.gVals[i] = Math.pow(i / 255, gInv) * 255;\n this.bVals[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (i = 0, len = data.length; i < len; i += 4) {\n data[i] = this.rVals[data[i]];\n data[i + 1] = this.gVals[data[i + 1]];\n data[i + 2] = this.bVals[data[i + 2]];\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uGamma: gl.getUniformLocation(program, 'uGamma'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma\n */\n fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\n filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ {\n\n type: 'Composed',\n\n /**\n * A non sparse array of filters to apply\n */\n subFilters: [],\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.subFilters = this.subFilters.slice(0);\n },\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo: function(options) {\n options.passes += this.subFilters.length - 1;\n this.subFilters.forEach(function(filter) {\n filter.applyTo(options);\n });\n },\n\n /**\n * Serialize this filter into JSON.\n *\n * @returns {Object} A JSON representation of this filter.\n */\n toObject: function() {\n return fabric.util.object.extend(this.callSuper('toObject'), {\n subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }),\n });\n },\n\n isNeutralState: function() {\n return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); });\n }\n });\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n */\n fabric.Image.filters.Composed.fromObject = function(object, callback) {\n var filters = object.subFilters || [],\n subFilters = filters.map(function(filter) {\n return new fabric.Image.filters[filter.type](filter);\n }),\n instance = new fabric.Image.filters.Composed({ subFilters: subFilters });\n callback && callback(instance);\n return instance;\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * HueRotation filter class\n * @class fabric.Image.filters.HueRotation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'HueRotation',\n\n /**\n * HueRotation value, from -1 to 1.\n * the unit is radians\n * @param {Number} myParameter\n * @default\n */\n rotation: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'rotation',\n\n calculateMatrix: function() {\n var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad),\n aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos;\n this.matrix = [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ];\n this.matrix[0] = cos + OneMinusCos / 3;\n this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[6] = cos + aThird * OneMinusCos;\n this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[12] = cos + aThird * OneMinusCos;\n },\n\n /**\n * HueRotation isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function(options) {\n this.calculateMatrix();\n return filters.BaseFilter.prototype.isNeutralState.call(this, options);\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n this.calculateMatrix();\n filters.BaseFilter.prototype.applyTo.call(this, options);\n },\n\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation\n */\n fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n clone = fabric.util.object.clone;\n\n if (fabric.Text) {\n fabric.warn('fabric.Text is already defined');\n return;\n }\n\n /**\n * Text class\n * @class fabric.Text\n * @extends fabric.Object\n * @return {fabric.Text} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n * @see {@link fabric.Text#initialize} for constructor definition\n */\n fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ {\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Array\n * @private\n */\n _dimensionAffectingProps: [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n ],\n\n /**\n * @private\n */\n _reNewline: /\\r?\\n/,\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpacesAndTabs: /[ \\t\\r]/g,\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpaceAndTab: /[ \\t\\r]/,\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reWords: /\\S+/g,\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'text',\n\n /**\n * Font size (in pixels)\n * @type Number\n * @default\n */\n fontSize: 40,\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n * @default\n */\n fontWeight: 'normal',\n\n /**\n * Font family\n * @type String\n * @default\n */\n fontFamily: 'Times New Roman',\n\n /**\n * Text decoration underline.\n * @type Boolean\n * @default\n */\n underline: false,\n\n /**\n * Text decoration overline.\n * @type Boolean\n * @default\n */\n overline: false,\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n * @default\n */\n linethrough: false,\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n * @default\n */\n textAlign: 'left',\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n * @default\n */\n fontStyle: 'normal',\n\n /**\n * Line height\n * @type Number\n * @default\n */\n lineHeight: 1.16,\n\n /**\n * Superscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n superscript: {\n size: 0.60, // fontSize factor\n baseline: -0.35 // baseline-shift factor (upwards)\n },\n\n /**\n * Subscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n subscript: {\n size: 0.60, // fontSize factor\n baseline: 0.11 // baseline-shift factor (downwards)\n },\n\n /**\n * Background color of text lines\n * @type String\n * @default\n */\n textBackgroundColor: '',\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('fontFamily',\n 'fontWeight',\n 'fontSize',\n 'text',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'fontStyle',\n 'lineHeight',\n 'textBackgroundColor',\n 'charSpacing',\n 'styles'),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('fontFamily',\n 'fontWeight',\n 'fontSize',\n 'text',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'fontStyle',\n 'lineHeight',\n 'textBackgroundColor',\n 'charSpacing',\n 'styles'),\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color.\n * Backwards incompatibility note: This property was named \"strokeStyle\" until v1.1.6\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property was named \"textShadow\" (String) until v1.2.11\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * @private\n */\n _fontSizeFraction: 0.222,\n\n /**\n * @private\n */\n offsets: {\n underline: 0.10,\n linethrough: -0.315,\n overline: -0.88\n },\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n * @default\n */\n _fontSizeMult: 1.13,\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n * @default\n */\n charSpacing: 0,\n\n /**\n * Object containing character styles - top-level properties -> line numbers,\n * 2nd-level properties - charater numbers\n * @type Object\n * @default\n */\n styles: null,\n\n /**\n * Reference to a context to measure text char or couple of chars\n * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas\n * once created it will be referenced on fabric._measuringContext to avoide creating a canvas for every\n * text object created.\n * @type {CanvasRenderingContext2D}\n * @default\n */\n _measuringContext: null,\n\n /**\n * Baseline shift, stlyes only, keep at 0 for the main text object\n * @type {Number}\n * @default\n */\n deltaY: 0,\n\n /**\n * Array of properties that define a style unit (of 'styles').\n * @type {Array}\n * @default\n */\n _styleProperties: [\n 'stroke',\n 'strokeWidth',\n 'fill',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontStyle',\n 'underline',\n 'overline',\n 'linethrough',\n 'deltaY',\n 'textBackgroundColor',\n ],\n\n /**\n * contains characters bounding boxes\n */\n __charBounds: [],\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @default\n * @readonly\n * @private\n */\n CACHE_FONT_SIZE: 400,\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n * @default\n */\n MIN_TEXT_WIDTH: 2,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n initialize: function(text, options) {\n this.styles = options ? (options.styles || { }) : { };\n this.text = text;\n this.__skipDimension = true;\n this.callSuper('initialize', options);\n this.__skipDimension = false;\n this.initDimensions();\n this.setCoords();\n this.setupState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Return a contex for measurement of text string.\n * if created it gets stored for reuse\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n getMeasuringContext: function() {\n // if we did not return we have to measure something.\n if (!fabric._measuringContext) {\n fabric._measuringContext = this.canvas && this.canvas.contextCache ||\n fabric.util.createCanvasElement().getContext('2d');\n }\n return fabric._measuringContext;\n },\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText: function() {\n var newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n },\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this._splitText();\n this._clearCache();\n this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces: function() {\n var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (var j = 0, jlen = line.length; j <= jlen; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n }\n else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n return lineIndex === this._textLines.length - 1;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always for text and Itext.\n * @return Number\n */\n missingNewlineOffset: function() {\n return 1;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var dims = this.callSuper('_getCacheCanvasDimensions');\n var fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n }\n else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n },\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles: function(ctx, charStyle, forMeasuring) {\n ctx.textBaseline = 'alphabetic';\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n },\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of fabric.Text object\n */\n calcTextWidth: function() {\n var maxWidth = this.getLineWidth(0);\n\n for (var i = 1, len = this._textLines.length; i < len; i++) {\n var currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n },\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine: function(method, ctx, line, left, top, lineIndex) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n },\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground: function(ctx) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n var lineTopOffset = 0, heightOfLine,\n lineLeftOffset, originalFill = ctx.fillStyle,\n line, lastColor,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(),\n boxStart = 0, boxWidth = 0, charBox, currentColor;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) {\n lineTopOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n lineLeftOffset = this._getLineLeftOffset(i);\n boxWidth = 0;\n boxStart = 0;\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n ctx.fillStyle = lastColor;\n lastColor && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n topOffset + lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor) {\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n topOffset + lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {Object} decl style declaration for cache\n * @param {String} decl.fontFamily fontFamily\n * @param {String} decl.fontStyle fontStyle\n * @param {String} decl.fontWeight fontWeight\n * @return {Object} reference to cache\n */\n getFontCache: function(decl) {\n var fontFamily = decl.fontFamily.toLowerCase();\n if (!fabric.charWidthsCache[fontFamily]) {\n fabric.charWidthsCache[fontFamily] = { };\n }\n var cache = fabric.charWidthsCache[fontFamily],\n cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase();\n if (!cache[cacheProp]) {\n cache[cacheProp] = { };\n }\n return cache[cacheProp];\n },\n\n /**\n * apply all the character style to canvas for rendering\n * @private\n * @param {String} _char\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} [decl]\n */\n _applyCharStyles: function(method, ctx, lineIndex, charIndex, styleDeclaration) {\n\n this._setFillStyles(ctx, styleDeclaration);\n this._setStrokeStyles(ctx, styleDeclaration);\n\n ctx.font = this._getFontDeclaration(styleDeclaration);\n },\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar: function(_char, charStyle, previousChar, prevCharStyle) {\n // first i try to return from cache\n var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle),\n previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char,\n stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth,\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth;\n }\n if (width === undefined || previousWidth === undefined || coupleWidth === undefined) {\n var ctx = this.getMeasuringContext();\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n }\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n kernedWidth = coupleWidth - previousWidth;\n }\n return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier };\n },\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar: function(line, _char) {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n },\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n measureLine: function(lineIndex) {\n var lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n },\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine: function(lineIndex) {\n var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme,\n graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length);\n\n this.__charBounds[lineIndex] = lineBounds;\n for (i = 0; i < line.length; i++) {\n grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[i] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize\n };\n return { width: width, numOfSpaces: numOfSpaces };\n },\n\n /**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * @private\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n */\n _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) {\n var style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { },\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle),\n kernedWidth = info.kernedWidth,\n width = info.width, charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n var box = {\n width: width,\n left: 0,\n height: style.fontSize,\n kernedWidth: kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n var previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n },\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine: function(lineIndex) {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n var line = this._textLines[lineIndex],\n // char 0 is measured before the line cycle because it nneds to char\n // emptylines\n maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (var i = 1, len = line.length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult;\n },\n\n /**\n * Calculate text box height\n */\n calcTextHeight: function() {\n var lineHeight, height = 0;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);\n }\n return height;\n },\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset: function() {\n return -this.width / 2;\n },\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset: function() {\n return -this.height / 2;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon: function(ctx, method) {\n ctx.save();\n var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset(),\n offsets = this._applyPatternGradientTransform(ctx, method === 'fillText' ? this.fill : this.stroke);\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n var heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset - offsets.offsetX,\n top + lineHeights + maxHeight - offsets.offsetY,\n i\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill: function(ctx) {\n if (!this.fill && !this.styleHas('fill')) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke: function(ctx) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Content of the line\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n * @param {Number} charOffset\n */\n _renderChars: function(method, ctx, line, left, top, lineIndex) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex);\n\n ctx.save();\n top -= lineHeight * this._fontSizeFraction / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n this._renderChar(method, ctx, lineIndex, 0, this.textLines[lineIndex], left, top, lineHeight);\n ctx.restore();\n return;\n }\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n left += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = this._hasStyleChanged(actualStyle, nextStyle);\n }\n if (timeToRender) {\n this._renderChar(method, ctx, lineIndex, i, charsToRender, left, top, lineHeight);\n charsToRender = '';\n actualStyle = nextStyle;\n left += boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) {\n var decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n decl && ctx.save();\n\n this._applyCharStyles(method, ctx, lineIndex, charIndex, fullDecl);\n\n if (decl && decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl && decl.deltaY) {\n top += decl.deltaY;\n }\n\n shouldFill && ctx.fillText(_char, left, top);\n shouldStroke && ctx.strokeText(_char, left, top);\n decl && ctx.restore();\n },\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSuperscript: function(start, end) {\n return this._setScript(start, end, this.superscript);\n },\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSubscript: function(start, end) {\n return this._setScript(start, end, this.subscript);\n },\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n _setScript: function(start, end, schema) {\n var loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline };\n this.setSelectionStyles(style, start, end);\n return this;\n },\n\n /**\n * @private\n * @param {Object} prevStyle\n * @param {Object} thisStyle\n */\n _hasStyleChanged: function(prevStyle, thisStyle) {\n return prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.deltaY !== thisStyle.deltaY;\n },\n\n /**\n * @private\n * @param {Object} prevStyle\n * @param {Object} thisStyle\n */\n _hasStyleChangedForSvg: function(prevStyle, thisStyle) {\n return this._hasStyleChanged(prevStyle, thisStyle) ||\n prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough;\n },\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset: function(lineIndex) {\n var lineWidth = this.getLineWidth(lineIndex);\n if (this.textAlign === 'center') {\n return (this.width - lineWidth) / 2;\n }\n if (this.textAlign === 'right') {\n return this.width - lineWidth;\n }\n if (this.textAlign === 'justify-center' && this.isEndOfWrapping(lineIndex)) {\n return (this.width - lineWidth) / 2;\n }\n if (this.textAlign === 'justify-right' && this.isEndOfWrapping(lineIndex)) {\n return this.width - lineWidth;\n }\n return 0;\n },\n\n /**\n * @private\n */\n _clearCache: function() {\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n },\n\n /**\n * @private\n */\n _shouldClearDimensionCache: function() {\n var shouldClear = this._forceClearCache;\n shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps'));\n if (shouldClear) {\n this.dirty = true;\n this._forceClearCache = false;\n }\n return shouldClear;\n },\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth: function(lineIndex) {\n if (this.__lineWidths[lineIndex]) {\n return this.__lineWidths[lineIndex];\n }\n\n var width, line = this._textLines[lineIndex], lineInfo;\n\n if (line === '') {\n width = 0;\n }\n else {\n lineInfo = this.measureLine(lineIndex);\n width = lineInfo.width;\n }\n this.__lineWidths[lineIndex] = width;\n return width;\n },\n\n _getWidthOfCharSpacing: function() {\n if (this.charSpacing !== 0) {\n return this.fontSize * this.charSpacing / 1000;\n }\n return 0;\n },\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the charater number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt: function(lineIndex, charIndex, property) {\n var charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n if (charStyle && typeof charStyle[property] !== 'undefined') {\n return charStyle[property];\n }\n return this[property];\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration: function(ctx, type) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n var heightOfLine, size, _size,\n lineLeftOffset, dy, _dy,\n line, lastDecoration,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(), top,\n boxStart, boxWidth, charBox, currentDecoration,\n maxHeight, currentFill, lastFill,\n charSpacing = this._getWidthOfCharSpacing();\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n maxHeight = heightOfLine / this.lineHeight;\n lineLeftOffset = this._getLineLeftOffset(i);\n boxStart = 0;\n boxWidth = 0;\n lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n lastFill = this.getValueOfPropertyAt(i, 0, 'fill');\n top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n size = this.getHeightOfChar(i, 0);\n dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, 'fill');\n _size = this.getHeightOfChar(i, j);\n _dy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if ((currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy) &&\n boxWidth > 0) {\n ctx.fillStyle = lastFill;\n lastDecoration && lastFill && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n top + this.offsets[type] * size + dy,\n boxWidth,\n this.fontSize / 15\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastFill = currentFill;\n size = _size;\n dy = _dy;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n ctx.fillStyle = currentFill;\n currentDecoration && currentFill && ctx.fillRect(\n leftOffset + lineLeftOffset + boxStart,\n top + this.offsets[type] * size + dy,\n boxWidth - charSpacing,\n this.fontSize / 15\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration: function(styleObject, forMeasuring) {\n var style = styleObject || this, family = this.fontFamily,\n fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1;\n var fontFamily = family === undefined ||\n family.indexOf('\\'') > -1 || family.indexOf(',') > -1 ||\n family.indexOf('\"') > -1 || fontIsGeneric\n ? style.fontFamily : '\"' + style.fontFamily + '\"';\n return [\n // node-canvas needs \"weight style\", while browsers need \"style weight\"\n // verify if this can be fixed in JSDOM\n (fabric.isLikelyNode ? style.fontWeight : style.fontStyle),\n (fabric.isLikelyNode ? style.fontStyle : style.fontWeight),\n forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px',\n fontFamily\n ].join(' ');\n },\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if object is not visible\n if (!this.visible) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n }\n this.callSuper('render', ctx);\n },\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns {Array} Lines in the text\n */\n _splitTextIntoLines: function(text) {\n var lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'],\n newText = [];\n for (var i = 0; i < lines.length; i++) {\n newLines[i] = fabric.util.string.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var additionalProperties = [\n 'text',\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'underline',\n 'overline',\n 'linethrough',\n 'textAlign',\n 'textBackgroundColor',\n 'charSpacing',\n ].concat(propertiesToInclude);\n var obj = this.callSuper('toObject', additionalProperties);\n obj.styles = clone(this.styles, true);\n return obj;\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n this.callSuper('set', key, value);\n var needsDims = false;\n if (typeof key === 'object') {\n for (var _key in key) {\n needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1;\n }\n }\n else {\n needsDims = this._dimensionAffectingProps.indexOf(key) !== -1;\n }\n if (needsDims) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity: function() {\n return 1;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement})\n * @static\n * @memberOf fabric.Text\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(\n 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' '));\n\n /**\n * Default SVG font size\n * @static\n * @memberOf fabric.Text\n */\n fabric.Text.DEFAULT_SVG_FONT_SIZE = 16;\n\n /**\n * Returns fabric.Text instance from an SVG element (not yet implemented)\n * @static\n * @memberOf fabric.Text\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Text.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES),\n parsedAnchor = parsedAttributes.textAnchor || 'left';\n options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes);\n\n options.top = options.top || 0;\n options.left = options.left || 0;\n if (parsedAttributes.textDecoration) {\n var textDecoration = parsedAttributes.textDecoration;\n if (textDecoration.indexOf('underline') !== -1) {\n options.underline = true;\n }\n if (textDecoration.indexOf('overline') !== -1) {\n options.overline = true;\n }\n if (textDecoration.indexOf('line-through') !== -1) {\n options.linethrough = true;\n }\n delete options.textDecoration;\n }\n if ('dx' in parsedAttributes) {\n options.left += parsedAttributes.dx;\n }\n if ('dy' in parsedAttributes) {\n options.top += parsedAttributes.dy;\n }\n if (!('fontSize' in options)) {\n options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n\n var textContent = '';\n\n // The XML is not properly parsed in IE9 so a workaround to get\n // textContent is through firstChild.data. Another workaround would be\n // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does)\n if (!('textContent' in element)) {\n if ('firstChild' in element && element.firstChild !== null) {\n if ('data' in element.firstChild && element.firstChild.data !== null) {\n textContent = element.firstChild.data;\n }\n }\n }\n else {\n textContent = element.textContent;\n }\n\n textContent = textContent.replace(/^\\s+|\\s+$|\\n+/g, '').replace(/\\s+/g, ' ');\n var originalStrokeWidth = options.strokeWidth;\n options.strokeWidth = 0;\n\n var text = new fabric.Text(textContent, options),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff,\n offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (parsedAnchor === 'center') {\n offX = text.getScaledWidth() / 2;\n }\n if (parsedAnchor === 'right') {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight,\n strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1,\n });\n callback(text);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Text instance from an object representation\n * @static\n * @memberOf fabric.Text\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created\n */\n fabric.Text.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Text', object, callback, 'text');\n };\n\n fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'];\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text);\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n },\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (var p1 in obj) {\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n *\n * @param {string} property The property to compare between characters and text.\n */\n cleanStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue,\n allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject;\n // eslint-disable-next-line\n for (var p1 in obj) {\n letterCount = 0;\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n var styleObject = obj[p1][p2],\n stylePropertyHasBeenSet = styleObject.hasOwnProperty(property);\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n }\n else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property]) {\n delete styleObject[property];\n }\n }\n else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n }\n else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (var i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property] = stylePropertyValue;\n this.removeStyle(property);\n }\n },\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return;\n }\n var obj = this.styles, line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n },\n\n /**\n * @private\n */\n _extendStyles: function(index, styles) {\n var loc = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(loc.lineIndex)) {\n this._setLineStyle(loc.lineIndex);\n }\n\n if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) {\n this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {});\n }\n\n fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles);\n },\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. usefull to manage styles.\n */\n get2DCursorLocation: function(selectionStart, skipWrapping) {\n if (typeof selectionStart === 'undefined') {\n selectionStart = this.selectionStart;\n }\n var lines = skipWrapping ? this._unwrappedTextLines : this._textLines,\n len = lines.length;\n for (var i = 0; i < len; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart\n };\n }\n selectionStart -= lines[i].length + this.missingNewlineOffset(i);\n }\n return {\n lineIndex: i - 1,\n charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart\n };\n },\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, slectionStart or selectionEnd will be used.\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles: function(startIndex, endIndex, complete) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n var styles = [];\n for (var i = startIndex; i < endIndex; i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n },\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition: function(position, complete) {\n var loc = this.get2DCursorLocation(position),\n style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) :\n this._getStyleDeclaration(loc.lineIndex, loc.charIndex);\n return style || {};\n },\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @return {fabric.IText} thisArg\n * @chainable\n */\n setSelectionStyles: function(styles, startIndex, endIndex) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n for (var i = startIndex; i < endIndex; i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n return this;\n },\n\n /**\n * get the reference, not a clone, of the style object for a given character\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Object} style object\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n var lineStyle = this.styles && this.styles[lineIndex];\n if (!lineStyle) {\n return null;\n }\n return lineStyle[charIndex];\n },\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration: function(lineIndex, charIndex) {\n var style = this._getStyleDeclaration(lineIndex, charIndex) || { },\n styleObject = { }, prop;\n for (var i = 0; i < this._styleProperties.length; i++) {\n prop = this._styleProperties[i];\n styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop];\n }\n return styleObject;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n return !!this.styles[lineIndex];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n _setLineStyle: function(lineIndex) {\n this.styles[lineIndex] = {};\n },\n\n /**\n * @param {Number} lineIndex\n * @private\n */\n _deleteLineStyle: function(lineIndex) {\n delete this.styles[lineIndex];\n }\n });\n})();\n\n\n(function() {\n\n function parseDecoration(object) {\n if (object.textDecoration) {\n object.textDecoration.indexOf('underline') > -1 && (object.underline = true);\n object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true);\n object.textDecoration.indexOf('overline') > -1 && (object.overline = true);\n delete object.textDecoration;\n }\n }\n\n /**\n * IText class (introduced in v1.4) Events are also fired with \"text:\"\n * prefix when observing canvas.\n * @class fabric.IText\n * @extends fabric.Text\n * @mixes fabric.Observable\n *\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n *\n * @return {fabric.IText} thisArg\n * @see {@link fabric.IText#initialize} for constructor definition\n *\n *

Supported key combinations:

\n *
\n   *   Move cursor:                    left, right, up, down\n   *   Select character:               shift + left, shift + right\n   *   Select text vertically:         shift + up, shift + down\n   *   Move cursor by word:            alt + left, alt + right\n   *   Select words:                   shift + alt + left, shift + alt + right\n   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end\n   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end\n   *   Jump to start/end of text:      cmd + up, cmd + down\n   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n   *   Delete character:               backspace\n   *   Delete word:                    alt + backspace\n   *   Delete line:                    cmd + backspace\n   *   Forward delete:                 delete\n   *   Copy text:                      ctrl/cmd + c\n   *   Paste text:                     ctrl/cmd + v\n   *   Cut text:                       ctrl/cmd + x\n   *   Select entire text:             ctrl/cmd + a\n   *   Quit editing                    tab or esc\n   * 
\n *\n *

Supported mouse/touch combination

\n *
\n   *   Position cursor:                click/touch\n   *   Create selection:               click/touch & drag\n   *   Create selection:               click & shift + click\n   *   Select word:                    double click\n   *   Select line:                    triple click\n   * 
\n */\n fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'i-text',\n\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n selectionStart: 0,\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n selectionEnd: 0,\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(17,119,255,0.3)',\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n isEditing: false,\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n editable: true,\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n editingBorderColor: 'rgba(102,153,255,0.25)',\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n cursorWidth: 2,\n\n /**\n * Color of default cursor (when not overwritten by character style)\n * @type String\n * @default\n */\n cursorColor: '#333',\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n cursorDelay: 1000,\n\n /**\n * Duration of cursor fadein (in ms)\n * @type Number\n * @default\n */\n cursorDuration: 600,\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n caching: true,\n\n /**\n * @private\n */\n _reSpace: /\\s|\\n/,\n\n /**\n * @private\n */\n _currentCursorOpacity: 0,\n\n /**\n * @private\n */\n _selectionDirection: null,\n\n /**\n * @private\n */\n _abortCursorAnimation: false,\n\n /**\n * @private\n */\n __widthOfSpace: [],\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n inCompositionMode: false,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.IText} thisArg\n */\n initialize: function(text, options) {\n this.callSuper('initialize', text, options);\n this.initBehavior();\n },\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart: function(index) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n },\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd: function(index) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n },\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n _updateAndFire: function(property, index) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n },\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged: function() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n },\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions: function() {\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this.callSuper('initDimensions');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n this.clearContextTop();\n this.callSuper('render', ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = { };\n this.renderCursorOrSelection();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this.callSuper('_render', ctx);\n },\n\n /**\n * Prepare and clean the contextTop\n */\n clearContextTop: function(skipRestore) {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n this.transformMatrix && ctx.transform.apply(ctx, this.transformMatrix);\n this._clearTextArea(ctx);\n skipRestore || ctx.restore();\n },\n\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection: function() {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var boundaries = this._getCursorBoundaries(),\n ctx = this.canvas.contextTop;\n this.clearContextTop(true);\n if (this.selectionStart === this.selectionEnd) {\n this.renderCursor(boundaries, ctx);\n }\n else {\n this.renderSelection(boundaries, ctx);\n }\n ctx.restore();\n },\n\n _clearTextArea: function(ctx) {\n // we add 4 pixel, to be sure to do not leave any pixel out\n var width = this.width + 4, height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n },\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * @private\n * @param {Array} chars Array of characters\n * @param {String} typeOfBoundaries\n */\n _getCursorBoundaries: function(position) {\n\n // left/top are left/top of entire text box\n // leftOffset/topOffset are offset from that left/top point of a text box\n\n if (typeof position === 'undefined') {\n position = this.selectionStart;\n }\n\n var left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(position);\n\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top\n };\n },\n\n /**\n * @private\n */\n _getCursorBoundariesOffsets: function(position) {\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache;\n }\n var lineLeftOffset,\n lineIndex,\n charIndex,\n topOffset = 0,\n leftOffset = 0,\n boundaries,\n cursorPosition = this.get2DCursorLocation(position);\n charIndex = cursorPosition.charIndex;\n lineIndex = cursorPosition.lineIndex;\n for (var i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n var bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n this.cursorOffsetCache = boundaries;\n return this.cursorOffsetCache;\n },\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor: function(boundaries, ctx) {\n var cursorLocation = this.get2DCursorLocation(),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.scaleX * this.canvas.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n topOffset = boundaries.topOffset,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY');\n\n topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight\n - charHeight * (1 - this._fontSizeFraction);\n\n if (this.inCompositionMode) {\n this.renderSelection(boundaries, ctx);\n }\n\n ctx.fillStyle = this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');\n ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity;\n ctx.fillRect(\n boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n topOffset + boundaries.top + dy,\n cursorWidth,\n charHeight);\n },\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection: function(boundaries, ctx) {\n\n var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart,\n selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd,\n isJustify = this.textAlign.indexOf('justify') !== -1,\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (var i = startLine; i <= endLine; i++) {\n var lineOffset = this._getLineLeftOffset(i) || 0,\n lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0, boxStart = 0, boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5?\n }\n else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n }\n else {\n var charSpacing = this._getWidthOfCharSpacing();\n boxEnd = this.__charBounds[endLine][endChar - 1].left\n + this.__charBounds[endLine][endChar - 1].width - charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n ctx.fillRect(\n boundaries.left + lineOffset + boxStart,\n boundaries.top + boundaries.topOffset + lineHeight,\n boxEnd - boxStart,\n 1);\n }\n else {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(\n boundaries.left + lineOffset + boxStart,\n boundaries.top + boundaries.topOffset,\n boxEnd - boxStart,\n lineHeight);\n }\n\n\n boundaries.topOffset += realLineHeight;\n }\n },\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * @return {Number} Character font size\n */\n getCurrentCharFontSize: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n },\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * @return {String} Character color (fill)\n */\n getCurrentCharColor: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n },\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex: function() {\n var cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n });\n\n /**\n * Returns fabric.IText instance from an object representation\n * @static\n * @memberOf fabric.IText\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as argument\n */\n fabric.IText.fromObject = function(object, callback) {\n parseDecoration(object);\n if (object.styles) {\n for (var i in object.styles) {\n for (var j in object.styles[i]) {\n parseDecoration(object.styles[i][j]);\n }\n }\n }\n fabric.Object._fromObject('IText', object, callback, 'text');\n };\n})();\n\n\n(function() {\n\n var clone = fabric.util.object.clone;\n\n fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior: function() {\n this.initAddedHandler();\n this.initRemovedHandler();\n this.initCursorSelectionHandlers();\n this.initDoubleClickSimulation();\n this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n },\n\n onDeselect: function() {\n this.isEditing && this.exitEditing();\n this.selected = false;\n },\n\n /**\n * Initializes \"added\" event handler\n */\n initAddedHandler: function() {\n var _this = this;\n this.on('added', function() {\n var canvas = _this.canvas;\n if (canvas) {\n if (!canvas._hasITextHandlers) {\n canvas._hasITextHandlers = true;\n _this._initCanvasHandlers(canvas);\n }\n canvas._iTextInstances = canvas._iTextInstances || [];\n canvas._iTextInstances.push(_this);\n }\n });\n },\n\n initRemovedHandler: function() {\n var _this = this;\n this.on('removed', function() {\n var canvas = _this.canvas;\n if (canvas) {\n canvas._iTextInstances = canvas._iTextInstances || [];\n fabric.util.removeFromArray(canvas._iTextInstances, _this);\n if (canvas._iTextInstances.length === 0) {\n canvas._hasITextHandlers = false;\n _this._removeCanvasHandlers(canvas);\n }\n }\n });\n },\n\n /**\n * register canvas event to manage exiting on other instances\n * @private\n */\n _initCanvasHandlers: function(canvas) {\n canvas._mouseUpITextHandler = function() {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.__isMousedown = false;\n });\n }\n };\n canvas.on('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * remove canvas event to manage exiting on other instances\n * @private\n */\n _removeCanvasHandlers: function(canvas) {\n canvas.off('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * @private\n */\n _tick: function() {\n this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');\n },\n\n /**\n * @private\n */\n _animateCursor: function(obj, targetOpacity, duration, completeMethod) {\n\n var tickState;\n\n tickState = {\n isAborted: false,\n abort: function() {\n this.isAborted = true;\n },\n };\n\n obj.animate('_currentCursorOpacity', targetOpacity, {\n duration: duration,\n onComplete: function() {\n if (!tickState.isAborted) {\n obj[completeMethod]();\n }\n },\n onChange: function() {\n // we do not want to animate a selection, only cursor\n if (obj.canvas && obj.selectionStart === obj.selectionEnd) {\n obj.renderCursorOrSelection();\n }\n },\n abort: function() {\n return tickState.isAborted;\n }\n });\n return tickState;\n },\n\n /**\n * @private\n */\n _onTickComplete: function() {\n\n var _this = this;\n\n if (this._cursorTimeout1) {\n clearTimeout(this._cursorTimeout1);\n }\n this._cursorTimeout1 = setTimeout(function() {\n _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');\n }, 100);\n },\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor: function(restart) {\n var _this = this,\n delay = restart ? 0 : this.cursorDelay;\n\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this._cursorTimeout2 = setTimeout(function() {\n _this._tick();\n }, delay);\n },\n\n /**\n * Aborts cursor animation and clears all timeouts\n */\n abortCursorAnimation: function() {\n var shouldClear = this._currentTickState || this._currentTickCompleteState,\n canvas = this.canvas;\n this._currentTickState && this._currentTickState.abort();\n this._currentTickCompleteState && this._currentTickCompleteState.abort();\n\n clearTimeout(this._cursorTimeout1);\n clearTimeout(this._cursorTimeout2);\n\n this._currentCursorOpacity = 0;\n // to clear just itext area we need to transform the context\n // it may not be worth it\n if (shouldClear && canvas) {\n canvas.clearContext(canvas.contextTop || canvas.contextContainer);\n }\n\n },\n\n /**\n * Selects entire text\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectAll: function() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText: function() {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n },\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary: function(selectionStart, direction) {\n var index = this._reSpace.test(this._text[selectionStart]) ? selectionStart - 1 : selectionStart,\n _char = this._text[index],\n reNonWord = /[ \\n\\.,;!\\?\\-]/;\n\n while (!reNonWord.test(_char) && index > 0 && index < this._text.length) {\n index += direction;\n _char = this._text[index];\n }\n if (reNonWord.test(_char) && _char !== '\\n') {\n index += direction === 1 ? 0 : 1;\n }\n return index;\n },\n\n /**\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */\n newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n },\n\n /**\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectLine: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Enters editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n enterEditing: function(e) {\n if (this.isEditing || !this.editable) {\n return;\n }\n\n if (this.canvas) {\n this.canvas.calcOffset();\n this.exitEditingOnOthers(this.canvas);\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea(e);\n this.hiddenTextarea.focus();\n this.hiddenTextarea.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered');\n this._fireSelectionChanged();\n if (!this.canvas) {\n return this;\n }\n this.canvas.fire('text:editing:entered', { target: this });\n this.initMouseMoveHandler();\n this.canvas.requestRenderAll();\n return this;\n },\n\n exitEditingOnOthers: function(canvas) {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.selected = false;\n if (obj.isEditing) {\n obj.exitEditing();\n }\n });\n }\n },\n\n /**\n * Initializes \"mousemove\" event handler\n */\n initMouseMoveHandler: function() {\n this.canvas.on('mouse:move', this.mouseMoveHandler);\n },\n\n /**\n * @private\n */\n mouseMoveHandler: function(options) {\n if (!this.__isMousedown || !this.isEditing) {\n return;\n }\n\n var newSelectionStart = this.getSelectionStartFromPointer(options.e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)\n &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n }\n else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {\n this.restartCursorIfNeeded();\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * @private\n */\n _setEditingProps: function() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n },\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection: function(start, end, text) {\n var smallerTextStart = text.slice(0, start),\n graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = text.slice(start, end),\n graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection: function(start, end, _text) {\n var smallerTextStart = _text.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = _text.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * @private\n */\n _updateTextarea: function() {\n this.cursorOffsetCache = { };\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateFromTextArea: function() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = { };\n this.text = this.hiddenTextarea.value;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n var newSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateTextareaPosition: function() {\n if (this.selectionStart === this.selectionEnd) {\n var style = this._calcTextareaPosition();\n this.hiddenTextarea.style.left = style.left;\n this.hiddenTextarea.style.top = style.top;\n }\n },\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition: function() {\n if (!this.canvas) {\n return { x: 1, y: 1 };\n }\n var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,\n leftOffset = boundaries.leftOffset,\n m = this.calcTransformMatrix(),\n p = {\n x: boundaries.left + leftOffset,\n y: boundaries.top + boundaries.topOffset + charHeight\n },\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width,\n upperCanvasHeight = upperCanvas.height,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight,\n scaleX = upperCanvas.clientWidth / upperCanvasWidth,\n scaleY = upperCanvas.clientHeight / upperCanvasHeight;\n\n p = fabric.util.transformPoint(p, m);\n p = fabric.util.transformPoint(p, this.canvas.viewportTransform);\n p.x *= scaleX;\n p.y *= scaleY;\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };\n },\n\n /**\n * @private\n */\n _saveEditingProps: function() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor\n };\n },\n\n /**\n * @private\n */\n _restoreEditingProps: function() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor = this._savedProps.defaultCursor;\n this.canvas.moveCursor = this._savedProps.moveCursor;\n }\n },\n\n /**\n * Exits from editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n exitEditing: function() {\n var isTextChanged = (this._textBeforeEdit !== this.text);\n this.selected = false;\n this.isEditing = false;\n\n this.selectionEnd = this.selectionStart;\n\n if (this.hiddenTextarea) {\n this.hiddenTextarea.blur && this.hiddenTextarea.blur();\n this.canvas && this.hiddenTextarea.parentNode.removeChild(this.hiddenTextarea);\n this.hiddenTextarea = null;\n }\n\n this.abortCursorAnimation();\n this._restoreEditingProps();\n this._currentCursorOpacity = 0;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire('modified');\n if (this.canvas) {\n this.canvas.off('mouse:move', this.mouseMoveHandler);\n this.canvas.fire('text:editing:exited', { target: this });\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n },\n\n /**\n * @private\n */\n _removeExtraneousStyles: function() {\n for (var prop in this.styles) {\n if (!this._textLines[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo: function(start, end) {\n var cursorStart = this.get2DCursorLocation(start, true),\n cursorEnd = this.get2DCursorLocation(end, true),\n lineStart = cursorStart.lineIndex,\n charStart = cursorStart.charIndex,\n lineEnd = cursorEnd.lineIndex,\n charEnd = cursorEnd.charIndex,\n i, styleObj;\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {\n styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = { });\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n }\n else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n styleObj = this.styles[lineStart];\n var diff = charEnd - charStart, numericChar, _char;\n for (i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (_char in this.styles[lineStart]) {\n numericChar = parseInt(_char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[_char];\n delete styleObj[_char];\n }\n }\n }\n }\n },\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles: function(lineIndex, offset) {\n // shift all line styles by offset upward or downward\n // do not clone deep. we need new array, not new style objects\n var clonedStyles = clone(this.styles);\n for (var line in this.styles) {\n var numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n },\n\n restartCursorIfNeeded: function() {\n if (!this._currentTickState || this._currentTickState.isAborted\n || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted\n ) {\n this.initDelayedCursor();\n }\n },\n\n /**\n * Inserts new style object\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {\n var currentCharStyle,\n newLineStyles = {},\n somethingAdded = false;\n\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n if (this.styles[lineIndex]) {\n currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];\n }\n\n // we clone styles of all chars\n // after cursor onto the current line\n for (var index in this.styles[lineIndex]) {\n var numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n somethingAdded = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n delete this.styles[lineIndex][index];\n }\n }\n if (somethingAdded) {\n this.styles[lineIndex + qty] = newLineStyles;\n }\n else {\n delete this.styles[lineIndex + qty];\n }\n // for the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 1) {\n qty--;\n if (copiedStyle && copiedStyle[qty]) {\n this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty]) };\n }\n else if (currentCharStyle) {\n this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };\n }\n else {\n delete this.styles[lineIndex + qty];\n }\n }\n this._forceClearCache = true;\n },\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {\n if (!this.styles) {\n this.styles = {};\n }\n var currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (var index in currentLineStylesCloned) {\n var numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = clone(newStyle);\n }\n },\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock: function(insertedText, start, copiedStyle) {\n var cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0], linesLength = 0;\n for (var i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n }\n else {\n addedLines[linesLength]++;\n }\n }\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength && this.insertNewlineStyleObject(\n cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);\n for (var i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n else if (copiedStyle) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n // we use i outside the loop to get it like linesLength\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n },\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift: function(start, end, newSelection) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = 'left';\n }\n else if (this._selectionDirection === 'right') {\n this._selectionDirection = 'left';\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n }\n else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === 'right') {\n this.selectionEnd = newSelection;\n }\n else {\n this.selectionStart = newSelection;\n }\n }\n else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = 'right';\n }\n else if (this._selectionDirection === 'left') {\n this._selectionDirection = 'right';\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n },\n\n setSelectionInBoundaries: function() {\n var length = this.text.length;\n if (this.selectionStart > length) {\n this.selectionStart = length;\n }\n else if (this.selectionStart < 0) {\n this.selectionStart = 0;\n }\n if (this.selectionEnd > length) {\n this.selectionEnd = length;\n }\n else if (this.selectionEnd < 0) {\n this.selectionEnd = 0;\n }\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n /**\n * Initializes \"dbclick\" event handler\n */\n initDoubleClickSimulation: function() {\n\n // for double click\n this.__lastClickTime = +new Date();\n\n // for triple click\n this.__lastLastClickTime = +new Date();\n\n this.__lastPointer = { };\n\n this.on('mousedown', this.onMouseDown);\n },\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown: function(options) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n var newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n this._stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastIsEditing = this.isEditing;\n this.__lastSelected = this.selected;\n },\n\n isTripleClick: function(newPointer) {\n return this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y;\n },\n\n /**\n * @private\n */\n _stopEvent: function(e) {\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n },\n\n /**\n * Initializes event handlers related to cursor or selection\n */\n initCursorSelectionHandlers: function() {\n this.initMousedownHandler();\n this.initMouseupHandler();\n this.initClicks();\n },\n\n /**\n * Initializes double and triple click event handlers\n */\n initClicks: function() {\n this.on('mousedblclick', function(options) {\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n });\n this.on('tripleclick', function(options) {\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n });\n },\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n */\n _mouseDownHandler: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n this.__isMousedown = true;\n\n if (this.selected) {\n this.setCursorByClick(options.e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n if (this === this.canvas._activeObject) {\n this.selected = true;\n }\n },\n\n /**\n * Initializes \"mousedown\" event handler\n */\n initMousedownHandler: function() {\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n },\n\n /**\n * Initializes \"mouseup\" event handler\n */\n initMouseupHandler: function() {\n this.on('mouseup', this.mouseUpHandler);\n },\n\n /**\n * standard hander for mouse up, overridable\n * @private\n */\n mouseUpHandler: function(options) {\n this.__isMousedown = false;\n if (!this.editable || this.group ||\n (options.transform && options.transform.actionPerformed) ||\n (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n if (this.canvas) {\n var currentActive = this.canvas._activeObject;\n if (currentActive && currentActive !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (this.__lastSelected && !this.__corner) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(options.e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n }\n else {\n this.renderCursorOrSelection();\n }\n }\n else {\n this.selected = true;\n }\n },\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {Event} e Event object\n */\n setCursorByClick: function(e) {\n var newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart, end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n }\n else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {Event} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer: function(e) {\n var mouseOffset = this.getLocalPointer(e),\n prevWidth = 0,\n width = 0,\n height = 0,\n charIndex = 0,\n lineIndex = 0,\n lineLeftOffset,\n line;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i) * this.scaleY;\n lineIndex = i;\n if (i > 0) {\n charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n }\n else {\n break;\n }\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n width = lineLeftOffset * this.scaleX;\n line = this._textLines[lineIndex];\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n prevWidth = width;\n // i removed something about flipX here, check.\n width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX;\n if (width <= mouseOffset.x) {\n charIndex++;\n }\n else {\n break;\n }\n }\n return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen);\n },\n\n /**\n * @private\n */\n _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) {\n // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0\n var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth,\n distanceBtwNextCharAndCursor = width - mouseOffset.x,\n offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor ||\n distanceBtwNextCharAndCursor < 0 ? 0 : 1,\n newSelectionStart = index + offset;\n // if object is horizontally flipped, mirror cursor location from the end\n if (this.flipX) {\n newSelectionStart = jlen - newSelectionStart;\n }\n\n if (newSelectionStart > this._text.length) {\n newSelectionStart = this._text.length;\n }\n\n return newSelectionStart;\n }\n});\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea: function() {\n this.hiddenTextarea = fabric.document.createElement('textarea');\n this.hiddenTextarea.setAttribute('autocapitalize', 'off');\n this.hiddenTextarea.setAttribute('autocorrect', 'off');\n this.hiddenTextarea.setAttribute('autocomplete', 'off');\n this.hiddenTextarea.setAttribute('spellcheck', 'false');\n this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', '');\n this.hiddenTextarea.setAttribute('wrap', 'off');\n var style = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top +\n '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' +\n ' paddingï½°top: ' + style.fontSize + ';';\n fabric.document.body.appendChild(this.hiddenTextarea);\n\n fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this));\n\n if (!this._clickHandlerInitialized && this.canvas) {\n fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this));\n this._clickHandlerInitialized = true;\n }\n },\n\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behaviour for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the fabric.Itext or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = fabric.util.object.clone(this.keysMap);\n * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0]\n */\n keysMap: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorRight',\n 36: 'moveCursorLeft',\n 37: 'moveCursorLeft',\n 38: 'moveCursorUp',\n 39: 'moveCursorRight',\n 40: 'moveCursorDown',\n },\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n ctrlKeysMapUp: {\n 67: 'copy',\n 88: 'cut'\n },\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n ctrlKeysMapDown: {\n 65: 'selectAll'\n },\n\n onClick: function() {\n // No need to trigger click event here, focus is enough to have the keyboard appear on Android\n this.hiddenTextarea && this.hiddenTextarea.focus();\n },\n\n /**\n * Handles keyup event\n * @param {Event} e Event object\n */\n onKeyDown: function(e) {\n if (!this.isEditing || this.inCompositionMode) {\n return;\n }\n if (e.keyCode in this.keysMap) {\n this[this.keysMap[e.keyCode]](e);\n }\n else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.clearContextTop();\n this.renderCursorOrSelection();\n }\n else {\n this.canvas && this.canvas.requestRenderAll();\n }\n },\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {Event} e Event object\n */\n onKeyUp: function(e) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n },\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput: function(e) {\n var fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n // decisions about style changes.\n var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n removedText, insertedText,\n charDiff = nextCharCount - charCount;\n if (this.hiddenTextarea.value === '') {\n this.styles = { };\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n return;\n }\n\n var textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value\n );\n var backDelete = this.selectionStart > textareaSelection.selectionStart;\n\n if (this.selectionStart !== this.selectionEnd) {\n removedText = this._text.slice(this.selectionStart, this.selectionEnd);\n charDiff += this.selectionEnd - this.selectionStart;\n }\n else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(this.selectionEnd + charDiff, this.selectionEnd);\n }\n else {\n removedText = this._text.slice(this.selectionStart, this.selectionStart - charDiff);\n }\n }\n insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd);\n if (removedText && removedText.length) {\n if (this.selectionStart !== this.selectionEnd) {\n this.removeStyleFromTo(this.selectionStart, this.selectionEnd);\n }\n else if (backDelete) {\n // detect differencies between forwardDelete and backDelete\n this.removeStyleFromTo(this.selectionEnd - removedText.length, this.selectionEnd);\n }\n else {\n this.removeStyleFromTo(this.selectionEnd, this.selectionEnd + removedText.length);\n }\n }\n if (insertedText.length) {\n if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) {\n this.insertNewStyleBlock(insertedText, this.selectionStart, fabric.copiedTextStyle);\n }\n else {\n this.insertNewStyleBlock(insertedText, this.selectionStart);\n }\n }\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n },\n /**\n * Composition start\n */\n onCompositionStart: function() {\n this.inCompositionMode = true;\n },\n\n /**\n * Composition end\n */\n onCompositionEnd: function() {\n this.inCompositionMode = false;\n },\n\n // /**\n // * Composition update\n // */\n onCompositionUpdate: function(e) {\n this.compositionStart = e.target.selectionStart;\n this.compositionEnd = e.target.selectionEnd;\n this.updateTextareaPosition();\n },\n\n /**\n * Copies selected text\n * @param {Event} e Event object\n */\n copy: function() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n\n fabric.copiedText = this.getSelectedText();\n if (!fabric.disableStyleCopyPaste) {\n fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true);\n }\n else {\n fabric.copiedTextStyle = null;\n }\n this._copyDone = true;\n },\n\n /**\n * Pastes text\n * @param {Event} e Event object\n */\n paste: function() {\n this.fromPaste = true;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @return {Object} Clipboard data object\n */\n _getClipboardData: function(e) {\n return (e && e.clipboardData) || fabric.window.clipboardData;\n },\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor: function(lineIndex, charIndex) {\n var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n },\n\n /**\n * Gets start offset of a selection\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex);\n },\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset: function(e, isRight) {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n }\n else {\n return this.selectionStart;\n }\n },\n\n /**\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return -this._textLines[lineIndex - 1].length\n + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset);\n },\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine: function(lineIndex, width) {\n\n var line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex),\n widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0, charWidth, foundMatch;\n\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n var leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1);\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n },\n\n\n /**\n * Moves cursor down\n * @param {Event} e Event object\n */\n moveCursorDown: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n },\n\n /**\n * Moves cursor up\n * @param {Event} e Event object\n */\n moveCursorUp: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n },\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {Event} e Event object\n */\n _moveCursorUpOrDown: function(direction, e) {\n // getUpCursorOffset\n // getDownCursorOffset\n var action = 'get' + direction + 'CursorOffset',\n offset = this[action](e, this._selectionDirection === 'right');\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n }\n else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n this.setSelectionInBoundaries();\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift: function(offset) {\n var newSelection = this._selectionDirection === 'left'\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection);\n return offset !== 0;\n },\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift: function(offset) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n },\n\n /**\n * Moves cursor left\n * @param {Event} e Event object\n */\n moveCursorLeft: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n },\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n */\n _move: function(e, prop, direction) {\n var newValue;\n if (e.altKey) {\n newValue = this['findWordBoundary' + direction](this[prop]);\n }\n else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) {\n newValue = this['findLineBoundary' + direction](this[prop]);\n }\n else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== undefined && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n },\n\n /**\n * @private\n */\n _moveLeft: function(e, prop) {\n return this._move(e, prop, 'Left');\n },\n\n /**\n * @private\n */\n _moveRight: function(e, prop) {\n return this._move(e, prop, 'Right');\n },\n\n /**\n * Moves cursor left without keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithoutShift: function(e) {\n var change = true;\n this._selectionDirection = 'left';\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) {\n change = this._moveLeft(e, 'selectionStart');\n\n }\n this.selectionEnd = this.selectionStart;\n return change;\n },\n\n /**\n * Moves cursor left while keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithShift: function(e) {\n if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) {\n return this._moveLeft(e, 'selectionEnd');\n }\n else if (this.selectionStart !== 0){\n this._selectionDirection = 'left';\n return this._moveLeft(e, 'selectionStart');\n }\n },\n\n /**\n * Moves cursor right\n * @param {Event} e Event object\n */\n moveCursorRight: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n },\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {Event} e Event object\n */\n _moveCursorLeftOrRight: function(direction, e) {\n var actionName = 'moveCursor' + direction + 'With';\n this._currentCursorOpacity = 1;\n\n if (e.shiftKey) {\n actionName += 'Shift';\n }\n else {\n actionName += 'outShift';\n }\n if (this[actionName](e)) {\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor right while keeping selection\n * @param {Event} e\n */\n moveCursorRightWithShift: function(e) {\n if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) {\n return this._moveRight(e, 'selectionStart');\n }\n else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = 'right';\n return this._moveRight(e, 'selectionEnd');\n }\n },\n\n /**\n * Moves cursor right without keeping selection\n * @param {Event} e Event object\n */\n moveCursorRightWithoutShift: function(e) {\n var changed = true;\n this._selectionDirection = 'right';\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n },\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars: function(start, end) {\n if (typeof end === 'undefined') {\n end = start + 1;\n }\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars: function(text, style, start, end) {\n if (typeof end === 'undefined') {\n end = start;\n }\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n var graphemes = fabric.util.string.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end));\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n var toFixed = fabric.util.toFixed,\n multipleSpacesRegex = / +/g;\n\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n\n /**\n * Returns SVG representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function() {\n var offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(\n this._toSVG(),\n { reviver: reviver, noStyle: true, withShadow: true }\n );\n },\n\n /**\n * @private\n */\n _getSVGLeftTopOffsets: function() {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0)\n };\n },\n\n /**\n * @private\n */\n _wrapSVGTextAndBg: function(textAndBg) {\n var noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textAndBg.textBgRects.join(''),\n '\\t\\t',\n textAndBg.textSpans.join(''),\n '\\n'\n ];\n },\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n _getSVGTextAndBg: function(textTopOffset, textLeftOffset) {\n var textSpans = [],\n textBgRects = [],\n height = textTopOffset, lineOffset;\n // bounding-box background\n this._setSVGBg(textBgRects);\n\n // text and text-background\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height);\n }\n this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height);\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans: textSpans,\n textBgRects: textBgRects\n };\n },\n\n /**\n * @private\n */\n _createTextCharSpan: function(_char, styleDecl, left, top) {\n var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex),\n styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace),\n fillStyles = styleProps ? 'style=\"' + styleProps + '\"' : '',\n dy = styleDecl.deltaY, dySpan = '',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n if (dy) {\n dySpan = ' dy=\"' + toFixed(dy, NUM_FRACTION_DIGITS) + '\" ';\n }\n return [\n '',\n fabric.util.string.escapeXml(_char),\n ''\n ].join('');\n },\n\n _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox, style,\n boxWidth = 0,\n line = this._textLines[lineIndex],\n timeToRender;\n\n textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight;\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = this._hasStyleChangedForSvg(actualStyle, nextStyle);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i) || { };\n textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset));\n charsToRender = '';\n actualStyle = nextStyle;\n textLeftOffset += boxWidth;\n boxWidth = 0;\n }\n }\n },\n\n _pushTextBgRect: function(textBgRects, color, left, top, width, height) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n },\n\n _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) {\n var line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight,\n boxWidth = 0,\n boxStart = 0,\n charBox, currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n },\n\n /**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n *\n * @private\n * @param {*} value\n * @return {String}\n */\n _getFillAttributes: function(value) {\n var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : '';\n if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) {\n return 'fill=\"' + value + '\"';\n }\n return 'opacity=\"' + fillColor.getAlpha() + '\" fill=\"' + fillColor.setAlpha(1).toRgb() + '\"';\n },\n\n /**\n * @private\n */\n _getSVGLineTopOffset: function(lineIndex) {\n var lineTopOffset = 0, lastHeight = 0;\n for (var j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult)\n };\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow);\n return svgStyle + ' white-space: pre;';\n },\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {});\n\n /**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n * @class fabric.Textbox\n * @extends fabric.IText\n * @mixes fabric.Observable\n * @return {fabric.Textbox} thisArg\n * @see {@link fabric.Textbox#initialize} for constructor definition\n */\n fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'textbox',\n\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n * @default\n */\n minWidth: 20,\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n * @default\n */\n dynamicMinWidth: 2,\n\n /**\n * Cached array of text wrapping.\n * @type Array\n */\n __cachedLines: null,\n\n /**\n * Override standard Object class values\n */\n lockScalingFlip: true,\n\n /**\n * Override standard Object class values\n * Textbox needs this on false\n */\n noScaleCache: false,\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Object\n * @private\n */\n _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'),\n\n /**\n * Use this regular expression to split strings in breakable lines\n * @private\n */\n _wordJoiners: /[ \\t\\r]/,\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japaense\n * @type Boolean\n * @since 2.6.0\n */\n splitByGrapheme: false,\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap: function(textInfo) {\n var realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0,\n map = {};\n\n for (var i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n }\n else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n },\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return fabric.Text.prototype.styleHas.call(this, property, lineIndex);\n },\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false;\n var map = this._styleMap[lineIndex];\n var mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (!map) {\n return null;\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return this.callSuper('_getStyleDeclaration', lineIndex, charIndex);\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n _setLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n this.styles[map.line] = {};\n },\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText: function(lines, desiredWidth) {\n var wrapped = [], i;\n this.isWrapping = true;\n for (i = 0; i < lines.length; i++) {\n wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth));\n }\n this.isWrapping = false;\n return wrapped;\n },\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * it gets called when charBounds are not available yet.\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n * @private\n */\n _measureWord: function(word, lineIndex, charOffset) {\n var width = 0, prevGrapheme, skipLeft = true;\n charOffset = charOffset || 0;\n for (var i = 0, len = word.length; i < len; i++) {\n var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft);\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n },\n\n /**\n * Wraps a line of text using the width of the Textbox and a context.\n * @param {Array} line The grapheme array that represent the line\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) {\n var lineWidth = 0,\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n line = [],\n // spaces in different languges?\n words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners),\n word = '',\n offset = 0,\n infix = splitByGrapheme ? '' : ' ',\n wordWidth = 0,\n infixWidth = 0,\n largestWordWidth = 0,\n lineJustStarted = true,\n additionalSpace = splitByGrapheme ? 0 : this._getWidthOfCharSpacing(),\n reservedSpace = reservedSpace || 0;\n // fix a difference between split and graphemeSplit\n if (words.length === 0) {\n words.push([]);\n }\n desiredWidth -= reservedSpace;\n for (var i = 0; i < words.length; i++) {\n // if using splitByGrapheme words are already in graphemes.\n word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]);\n wordWidth = this._measureWord(word, lineIndex, offset);\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n\n if (lineWidth >= desiredWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n }\n else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n // keep track of largest word\n if (wordWidth > largestWordWidth) {\n largestWordWidth = wordWidth;\n }\n }\n\n i && graphemeLines.push(line);\n\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n\n return graphemeLines;\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * @return Number\n */\n missingNewlineOffset: function(lineIndex) {\n if (this.splitByGrapheme) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n },\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines: function(text) {\n var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (var i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n },\n\n getMinWidth: function() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n },\n\n _removeExtraneousStyles: function() {\n var linesToKeep = {};\n for (var prop in this._styleMap) {\n if (this._textLines[prop]) {\n linesToKeep[this._styleMap[prop].line] = 1;\n }\n }\n for (var prop in this.styles) {\n if (!linesToKeep[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude));\n }\n });\n\n /**\n * Returns fabric.Textbox instance from an object representation\n * @static\n * @memberOf fabric.Textbox\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created\n */\n fabric.Textbox.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Textbox', object, callback, 'text');\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $includes = require('../internals/array-includes').includes;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.includes` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes\nexportTypedArrayMethod('includes', function includes(searchElement /* , fromIndex */) {\n return $includes(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n","import Vue from 'vue'\nimport { PropValidator } from 'vue/types/options'\nimport { deepEqual } from '../../util/helpers'\n\nexport default Vue.extend({\n name: 'comparable',\n props: {\n valueComparator: {\n type: Function,\n default: deepEqual,\n } as PropValidator,\n },\n})\n","/* eslint-disable no-new -- required for testing */\nvar global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar NATIVE_ARRAY_BUFFER_VIEWS = require('../internals/array-buffer-view-core').NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = global.ArrayBuffer;\nvar Int8Array = global.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n","import VCard from './VCard'\nimport { createSimpleFunctional } from '../../util/helpers'\n\nconst VCardActions = createSimpleFunctional('v-card__actions')\nconst VCardSubtitle = createSimpleFunctional('v-card__subtitle')\nconst VCardText = createSimpleFunctional('v-card__text')\nconst VCardTitle = createSimpleFunctional('v-card__title')\n\nexport {\n VCard,\n VCardActions,\n VCardSubtitle,\n VCardText,\n VCardTitle,\n}\n\nexport default {\n $_vuetify_subcomponents: {\n VCard,\n VCardActions,\n VCardSubtitle,\n VCardText,\n VCardTitle,\n },\n}\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $copyWithin = require('../internals/array-copy-within');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.copyWithin` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin\nexportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end */) {\n return $copyWithin.call(aTypedArray(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n});\n","var toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar bind = require('../internals/function-bind-context');\nvar aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, step, iterator, next;\n if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n O = [];\n while (!(step = next.call(iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2], 2);\n }\n length = toLength(O.length);\n result = new (aTypedArrayConstructor(this))(length);\n for (i = 0; length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n};\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $every = require('../internals/array-iteration').every;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.every` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.every\nexportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) {\n return $every(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","// eslint-disable-next-line es/no-typed-arrays -- safe\nmodule.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n","// Styles\nimport './VCheckbox.sass'\nimport '../../styles/components/_selection-controls.sass'\n\n// Components\nimport VIcon from '../VIcon'\nimport VInput from '../VInput'\n\n// Mixins\nimport Selectable from '../../mixins/selectable'\n\n/* @vue/component */\nexport default Selectable.extend({\n name: 'v-checkbox',\n\n props: {\n indeterminate: Boolean,\n indeterminateIcon: {\n type: String,\n default: '$checkboxIndeterminate',\n },\n offIcon: {\n type: String,\n default: '$checkboxOff',\n },\n onIcon: {\n type: String,\n default: '$checkboxOn',\n },\n },\n\n data () {\n return {\n inputIndeterminate: this.indeterminate,\n }\n },\n\n computed: {\n classes (): object {\n return {\n ...VInput.options.computed.classes.call(this),\n 'v-input--selection-controls': true,\n 'v-input--checkbox': true,\n 'v-input--indeterminate': this.inputIndeterminate,\n }\n },\n computedIcon (): string {\n if (this.inputIndeterminate) {\n return this.indeterminateIcon\n } else if (this.isActive) {\n return this.onIcon\n } else {\n return this.offIcon\n }\n },\n // Do not return undefined if disabled,\n // according to spec, should still show\n // a color when disabled and active\n validationState (): string | undefined {\n if (this.isDisabled && !this.inputIndeterminate) return undefined\n if (this.hasError && this.shouldValidate) return 'error'\n if (this.hasSuccess) return 'success'\n if (this.hasColor !== null) return this.computedColor\n return undefined\n },\n },\n\n watch: {\n indeterminate (val) {\n // https://github.com/vuetifyjs/vuetify/issues/8270\n this.$nextTick(() => (this.inputIndeterminate = val))\n },\n inputIndeterminate (val) {\n this.$emit('update:indeterminate', val)\n },\n isActive () {\n if (!this.indeterminate) return\n this.inputIndeterminate = false\n },\n },\n\n methods: {\n genCheckbox () {\n return this.$createElement('div', {\n staticClass: 'v-input--selection-controls__input',\n }, [\n this.$createElement(VIcon, this.setTextColor(this.validationState, {\n props: {\n dense: this.dense,\n dark: this.dark,\n light: this.light,\n },\n }), this.computedIcon),\n this.genInput('checkbox', {\n ...this.attrs$,\n 'aria-checked': this.inputIndeterminate\n ? 'mixed'\n : this.isActive.toString(),\n }),\n this.genRipple(this.setTextColor(this.rippleState)),\n ])\n },\n genDefaultSlot () {\n return [\n this.genCheckbox(),\n this.genLabel(),\n ]\n },\n },\n})\n","// Styles\nimport './VCard.sass'\n\n// Extensions\nimport VSheet from '../VSheet'\n\n// Mixins\nimport Loadable from '../../mixins/loadable'\nimport Routable from '../../mixins/routable'\n\n// Helpers\nimport mixins from '../../util/mixins'\n\n// Types\nimport { VNode } from 'vue'\n\n/* @vue/component */\nexport default mixins(\n Loadable,\n Routable,\n VSheet\n).extend({\n name: 'v-card',\n\n props: {\n flat: Boolean,\n hover: Boolean,\n img: String,\n link: Boolean,\n loaderHeight: {\n type: [Number, String],\n default: 4,\n },\n raised: Boolean,\n },\n\n computed: {\n classes (): object {\n return {\n 'v-card': true,\n ...Routable.options.computed.classes.call(this),\n 'v-card--flat': this.flat,\n 'v-card--hover': this.hover,\n 'v-card--link': this.isClickable,\n 'v-card--loading': this.loading,\n 'v-card--disabled': this.disabled,\n 'v-card--raised': this.raised,\n ...VSheet.options.computed.classes.call(this),\n }\n },\n styles (): object {\n const style: Dictionary = {\n ...VSheet.options.computed.styles.call(this),\n }\n\n if (this.img) {\n style.background = `url(\"${this.img}\") center center / cover no-repeat`\n }\n\n return style\n },\n },\n\n methods: {\n genProgress () {\n const render = Loadable.options.methods.genProgress.call(this)\n\n if (!render) return null\n\n return this.$createElement('div', {\n staticClass: 'v-card__progress',\n key: 'progress',\n }, [render])\n },\n },\n\n render (h): VNode {\n const { tag, data } = this.generateRouteLink()\n\n data.style = this.styles\n\n if (this.isClickable) {\n data.attrs = data.attrs || {}\n data.attrs.tabindex = 0\n }\n\n return h(tag, this.setBackgroundColor(this.color, data), [\n this.genProgress(),\n this.$slots.default,\n ])\n },\n})\n","'use strict';\nvar global = require('../internals/global');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar fails = require('../internals/fails');\n\nvar Int8Array = global.Int8Array;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $toLocaleString = [].toLocaleString;\nvar $slice = [].slice;\n\n// iOS Safari 6.x fails here\nvar TO_LOCALE_STRING_BUG = !!Int8Array && fails(function () {\n $toLocaleString.call(new Int8Array(1));\n});\n\nvar FORCED = fails(function () {\n return [1, 2].toLocaleString() != new Int8Array([1, 2]).toLocaleString();\n}) || !fails(function () {\n Int8Array.prototype.toLocaleString.call([1, 2]);\n});\n\n// `%TypedArray%.prototype.toLocaleString` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring\nexportTypedArrayMethod('toLocaleString', function toLocaleString() {\n return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);\n}, FORCED);\n","import { factory as PositionableFactory } from '../positionable'\nimport { TargetProp } from 'vuetify/types/services/application'\n\n// Util\nimport mixins from '../../util/mixins'\n\nexport default function applicationable (value: TargetProp, events: string[] = []) {\n /* @vue/component */\n return mixins(PositionableFactory(['absolute', 'fixed'])).extend({\n name: 'applicationable',\n\n props: {\n app: Boolean,\n },\n\n computed: {\n applicationProperty (): TargetProp {\n return value\n },\n },\n\n watch: {\n // If previous value was app\n // reset the provided prop\n app (x: boolean, prev: boolean) {\n prev\n ? this.removeApplication(true)\n : this.callUpdate()\n },\n applicationProperty (newVal, oldVal) {\n this.$vuetify.application.unregister(this._uid, oldVal)\n },\n },\n\n activated () {\n this.callUpdate()\n },\n\n created () {\n for (let i = 0, length = events.length; i < length; i++) {\n this.$watch(events[i], this.callUpdate)\n }\n this.callUpdate()\n },\n\n mounted () {\n this.callUpdate()\n },\n\n deactivated () {\n this.removeApplication()\n },\n\n destroyed () {\n this.removeApplication()\n },\n\n methods: {\n callUpdate () {\n if (!this.app) return\n\n this.$vuetify.application.register(\n this._uid,\n this.applicationProperty,\n this.updateApplication()\n )\n },\n removeApplication (force = false) {\n if (!force && !this.app) return\n\n this.$vuetify.application.unregister(\n this._uid,\n this.applicationProperty\n )\n },\n updateApplication: () => 0,\n },\n })\n}\n","// Extensions\nimport { BaseItemGroup } from '../../components/VItemGroup/VItemGroup'\n\n/* @vue/component */\nexport default BaseItemGroup.extend({\n name: 'button-group',\n\n provide (): object {\n return {\n btnToggle: this,\n }\n },\n\n computed: {\n classes (): object {\n return BaseItemGroup.options.computed.classes.call(this)\n },\n },\n\n methods: {\n // Isn't being passed down through types\n genData: BaseItemGroup.options.methods.genData,\n },\n})\n","import { VNodeDirective } from 'vue/types/vnode'\nimport { DirectiveOptions } from 'vue'\n\ninterface ScrollVNodeDirective extends Omit {\n value: EventListener | {\n handler: EventListener\n options?: boolean | AddEventListenerOptions\n } | EventListenerObject & { options?: boolean | AddEventListenerOptions }\n modifiers?: {\n self?: boolean\n }\n}\n\nfunction inserted (el: HTMLElement, binding: ScrollVNodeDirective) {\n const { self = false } = binding.modifiers || {}\n const value = binding.value\n const options = (typeof value === 'object' && value.options) || { passive: true }\n const handler = typeof value === 'function' || 'handleEvent' in value ? value : value.handler\n\n const target = self\n ? el\n : binding.arg\n ? document.querySelector(binding.arg)\n : window\n\n if (!target) return\n\n target.addEventListener('scroll', handler, options)\n\n el._onScroll = {\n handler,\n options,\n // Don't reference self\n target: self ? undefined : target,\n }\n}\n\nfunction unbind (el: HTMLElement) {\n if (!el._onScroll) return\n\n const { handler, options, target = el } = el._onScroll\n\n target.removeEventListener('scroll', handler, options)\n delete el._onScroll\n}\n\nexport const Scroll = {\n inserted,\n unbind,\n} as DirectiveOptions\n\nexport default Scroll\n","// Directives\nimport { Scroll } from '../../directives'\n\n// Utilities\nimport { consoleWarn } from '../../util/console'\n\n// Types\nimport Vue from 'vue'\n\n/**\n * Scrollable\n *\n * Used for monitoring scrolling and\n * invoking functions based upon\n * scrolling thresholds being\n * met.\n */\n/* @vue/component */\nexport default Vue.extend({\n name: 'scrollable',\n\n directives: { Scroll },\n\n props: {\n scrollTarget: String,\n scrollThreshold: [String, Number],\n },\n\n data: () => ({\n currentScroll: 0,\n currentThreshold: 0,\n isActive: false,\n isScrollingUp: false,\n previousScroll: 0,\n savedScroll: 0,\n target: null as Element | null,\n }),\n\n computed: {\n /**\n * A computed property that returns\n * whether scrolling features are\n * enabled or disabled\n */\n canScroll (): boolean {\n return typeof window !== 'undefined'\n },\n /**\n * The threshold that must be met before\n * thresholdMet function is invoked\n */\n computedScrollThreshold (): number {\n return this.scrollThreshold\n ? Number(this.scrollThreshold)\n : 300\n },\n },\n\n watch: {\n isScrollingUp () {\n this.savedScroll = this.savedScroll || this.currentScroll\n },\n isActive () {\n this.savedScroll = 0\n },\n },\n\n mounted () {\n if (this.scrollTarget) {\n this.target = document.querySelector(this.scrollTarget)\n\n if (!this.target) {\n consoleWarn(`Unable to locate element with identifier ${this.scrollTarget}`, this)\n }\n }\n },\n\n methods: {\n onScroll () {\n if (!this.canScroll) return\n\n this.previousScroll = this.currentScroll\n this.currentScroll = this.target\n ? this.target.scrollTop\n : window.pageYOffset\n\n this.isScrollingUp = this.currentScroll < this.previousScroll\n this.currentThreshold = Math.abs(this.currentScroll - this.computedScrollThreshold)\n\n this.$nextTick(() => {\n if (\n Math.abs(this.currentScroll - this.savedScroll) >\n this.computedScrollThreshold\n ) this.thresholdMet()\n })\n },\n /**\n * The method invoked when\n * scrolling in any direction\n * has exceeded the threshold\n */\n thresholdMet () { /* noop */ },\n },\n})\n","// Styles\nimport './VBottomNavigation.sass'\n\n// Mixins\nimport Applicationable from '../../mixins/applicationable'\nimport ButtonGroup from '../../mixins/button-group'\nimport Colorable from '../../mixins/colorable'\nimport Measurable from '../../mixins/measurable'\nimport Proxyable from '../../mixins/proxyable'\nimport Scrollable from '../../mixins/scrollable'\nimport Themeable from '../../mixins/themeable'\nimport { factory as ToggleableFactory } from '../../mixins/toggleable'\n\n// Utilities\nimport mixins from '../../util/mixins'\nimport { breaking } from '../../util/console'\n\n// Types\nimport { VNode } from 'vue'\n\nexport default mixins(\n Applicationable('bottom', [\n 'height',\n 'inputValue',\n ]),\n Colorable,\n Measurable,\n ToggleableFactory('inputValue'),\n Proxyable,\n Scrollable,\n Themeable\n /* @vue/component */\n).extend({\n name: 'v-bottom-navigation',\n\n props: {\n activeClass: {\n type: String,\n default: 'v-btn--active',\n },\n backgroundColor: String,\n grow: Boolean,\n height: {\n type: [Number, String],\n default: 56,\n },\n hideOnScroll: Boolean,\n horizontal: Boolean,\n inputValue: {\n type: Boolean,\n default: true,\n },\n mandatory: Boolean,\n shift: Boolean,\n tag: {\n type: String,\n default: 'div',\n },\n },\n\n data () {\n return {\n isActive: this.inputValue,\n }\n },\n\n computed: {\n canScroll (): boolean {\n return (\n Scrollable.options.computed.canScroll.call(this) &&\n (\n this.hideOnScroll ||\n !this.inputValue\n )\n )\n },\n classes (): object {\n return {\n 'v-bottom-navigation--absolute': this.absolute,\n 'v-bottom-navigation--grow': this.grow,\n 'v-bottom-navigation--fixed': !this.absolute && (this.app || this.fixed),\n 'v-bottom-navigation--horizontal': this.horizontal,\n 'v-bottom-navigation--shift': this.shift,\n }\n },\n styles (): object {\n return {\n ...this.measurableStyles,\n transform: this.isActive ? 'none' : 'translateY(100%)',\n }\n },\n },\n\n created () {\n /* istanbul ignore next */\n if (this.$attrs.hasOwnProperty('active')) {\n breaking('active.sync', 'value or v-model', this)\n }\n },\n\n methods: {\n thresholdMet () {\n this.isActive = !this.isScrollingUp\n this.$emit('update:input-value', this.isActive)\n },\n updateApplication (): number {\n return this.$el\n ? this.$el.clientHeight\n : 0\n },\n updateValue (val: any) {\n this.$emit('change', val)\n },\n },\n\n render (h): VNode {\n const data = this.setBackgroundColor(this.backgroundColor, {\n staticClass: 'v-bottom-navigation',\n class: this.classes,\n style: this.styles,\n props: {\n activeClass: this.activeClass,\n mandatory: Boolean(\n this.mandatory ||\n this.value !== undefined\n ),\n tag: this.tag,\n value: this.internalValue,\n },\n on: { change: this.updateValue },\n })\n\n if (this.canScroll) {\n data.directives = data.directives || []\n\n data.directives.push({\n arg: this.scrollTarget,\n name: 'scroll',\n value: this.onScroll,\n })\n }\n\n return h(ButtonGroup, this.setTextColor(this.color, data), this.$slots.default)\n },\n})\n","'use strict';\nvar $ = require('../internals/export');\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\n$({ target: 'URL', proto: true, enumerable: true }, {\n toJSON: function toJSON() {\n return URL.prototype.toString.call(this);\n }\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $filter = require('../internals/array-iteration').filter;\nvar fromSpeciesAndList = require('../internals/typed-array-from-species-and-list');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.filter` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter\nexportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) {\n var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return fromSpeciesAndList(this, list);\n});\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InputUploadButton.vue?vue&type=style&index=0&id=27e7f2c0&lang=scss&scoped=true&\"","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $reduce = require('../internals/array-reduce').left;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce\nexportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */) {\n return $reduce(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar floor = Math.floor;\n\n// `%TypedArray%.prototype.reverse` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse\nexportTypedArrayMethod('reverse', function reverse() {\n var that = this;\n var length = aTypedArray(that).length;\n var middle = floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n});\n","// Styles\nimport './VDivider.sass'\n\n// Types\nimport { VNode } from 'vue'\n\n// Mixins\nimport Themeable from '../../mixins/themeable'\n\nexport default Themeable.extend({\n name: 'v-divider',\n\n props: {\n inset: Boolean,\n vertical: Boolean,\n },\n\n render (h): VNode {\n // WAI-ARIA attributes\n let orientation\n if (!this.$attrs.role || this.$attrs.role === 'separator') {\n orientation = this.vertical ? 'vertical' : 'horizontal'\n }\n return h('hr', {\n class: {\n 'v-divider': true,\n 'v-divider--inset': this.inset,\n 'v-divider--vertical': this.vertical,\n ...this.themeClasses,\n },\n attrs: {\n role: 'separator',\n 'aria-orientation': orientation,\n ...this.$attrs,\n },\n on: this.$listeners,\n })\n },\n})\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $find = require('../internals/array-iteration').find;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.find` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.find\nexportTypedArrayMethod('find', function find(predicate /* , thisArg */) {\n return $find(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.forEach` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach\nexportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) {\n $forEach(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\n/* eslint-disable es/no-array-prototype-lastindexof -- safe */\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar min = Math.min;\nvar $lastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!$lastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return $lastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : $lastIndexOf;\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $indexOf = require('../internals/array-includes').indexOf;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof\nexportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex */) {\n return $indexOf(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar uid = require('../internals/uid');\n\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = global.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar isPrototypeOf = ObjectPrototype.isPrototypeOf;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQIRED = false;\nvar NAME;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar BigIntArrayConstructorsList = {\n BigInt64Array: 8,\n BigUint64Array: 8\n};\n\nvar isView = function isView(it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return klass === 'DataView'\n || has(TypedArrayConstructorsList, klass)\n || has(BigIntArrayConstructorsList, klass);\n};\n\nvar isTypedArray = function (it) {\n if (!isObject(it)) return false;\n var klass = classof(it);\n return has(TypedArrayConstructorsList, klass)\n || has(BigIntArrayConstructorsList, klass);\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (setPrototypeOf) {\n if (isPrototypeOf.call(TypedArray, C)) return C;\n } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n return C;\n }\n } throw TypeError('Target is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n delete TypedArrayConstructor.prototype[KEY];\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n redefine(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n delete TypedArrayConstructor[KEY];\n }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n redefine(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n if (!global[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow -- safe\n TypedArray = function TypedArray() {\n throw TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQIRED = true;\n defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n } });\n for (NAME in TypedArrayConstructorsList) if (global[NAME]) {\n createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n","var toInteger = require('../internals/to-integer');\n\nmodule.exports = function (it) {\n var result = toInteger(it);\n if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n return result;\n};\n","// Components\nimport VInput from '../../components/VInput'\n\n// Mixins\nimport Rippleable from '../rippleable'\nimport Comparable from '../comparable'\n\n// Utilities\nimport mixins from '../../util/mixins'\n\nexport function prevent (e: Event) {\n e.preventDefault()\n}\n\n/* @vue/component */\nexport default mixins(\n VInput,\n Rippleable,\n Comparable\n).extend({\n name: 'selectable',\n\n model: {\n prop: 'inputValue',\n event: 'change',\n },\n\n props: {\n id: String,\n inputValue: null as any,\n falseValue: null as any,\n trueValue: null as any,\n multiple: {\n type: Boolean,\n default: null,\n },\n label: String,\n },\n\n data () {\n return {\n hasColor: this.inputValue,\n lazyValue: this.inputValue,\n }\n },\n\n computed: {\n computedColor (): string | undefined {\n if (!this.isActive) return undefined\n if (this.color) return this.color\n if (this.isDark && !this.appIsDark) return 'white'\n return 'primary'\n },\n isMultiple (): boolean {\n return this.multiple === true || (this.multiple === null && Array.isArray(this.internalValue))\n },\n isActive (): boolean {\n const value = this.value\n const input = this.internalValue\n\n if (this.isMultiple) {\n if (!Array.isArray(input)) return false\n\n return input.some(item => this.valueComparator(item, value))\n }\n\n if (this.trueValue === undefined || this.falseValue === undefined) {\n return value\n ? this.valueComparator(value, input)\n : Boolean(input)\n }\n\n return this.valueComparator(input, this.trueValue)\n },\n isDirty (): boolean {\n return this.isActive\n },\n rippleState (): string | undefined {\n return !this.isDisabled && !this.validationState\n ? undefined\n : this.validationState\n },\n },\n\n watch: {\n inputValue (val) {\n this.lazyValue = val\n this.hasColor = val\n },\n },\n\n methods: {\n genLabel () {\n const label = VInput.options.methods.genLabel.call(this)\n\n if (!label) return label\n\n label!.data!.on = {\n // Label shouldn't cause the input to focus\n click: prevent,\n }\n\n return label\n },\n genInput (type: string, attrs: object) {\n return this.$createElement('input', {\n attrs: Object.assign({\n 'aria-checked': this.isActive.toString(),\n disabled: this.isDisabled,\n id: this.computedId,\n role: type,\n type,\n }, attrs),\n domProps: {\n value: this.value,\n checked: this.isActive,\n },\n on: {\n blur: this.onBlur,\n change: this.onChange,\n focus: this.onFocus,\n keydown: this.onKeydown,\n click: prevent,\n },\n ref: 'input',\n })\n },\n onBlur () {\n this.isFocused = false\n },\n onClick (e: Event) {\n this.onChange()\n this.$emit('click', e)\n },\n onChange () {\n if (!this.isInteractive) return\n\n const value = this.value\n let input = this.internalValue\n\n if (this.isMultiple) {\n if (!Array.isArray(input)) {\n input = []\n }\n\n const length = input.length\n\n input = input.filter((item: any) => !this.valueComparator(item, value))\n\n if (input.length === length) {\n input.push(value)\n }\n } else if (this.trueValue !== undefined && this.falseValue !== undefined) {\n input = this.valueComparator(input, this.trueValue) ? this.falseValue : this.trueValue\n } else if (value) {\n input = this.valueComparator(input, value) ? null : value\n } else {\n input = !input\n }\n\n this.validate(true, input)\n this.internalValue = input\n this.hasColor = input\n },\n onFocus () {\n this.isFocused = true\n },\n /** @abstract */\n onKeydown (e: Event) {},\n },\n})\n"],"sourceRoot":""}