From 84a956c4b6b357649d244dd23bc8f67a3129dae4 Mon Sep 17 00:00:00 2001 From: kangax Date: Sun, 14 Oct 2012 02:53:12 +0200 Subject: [PATCH] Lint everything with JSHint. Version 0.9.14. --- .jshintrc | 40 ++ HEADER.js | 2 +- dist/all.js | 947 ++++++++++++++++++------------------ dist/all.min.js | 4 +- dist/all.min.js.gz | Bin 42966 -> 42880 bytes package.json | 5 +- src/canvas.class.js | 53 +- src/canvas.serialization.js | 161 +++--- src/circle.class.js | 4 +- src/color.class.js | 39 +- src/ellipse.class.js | 2 +- src/gradient.class.js | 10 +- src/group.class.js | 13 +- src/image.class.js | 12 +- src/image_filters.js | 28 +- src/intersection.class.js | 6 +- src/line.class.js | 3 +- src/node.js | 17 +- src/object.class.js | 33 +- src/observable.js | 2 +- src/parser.js | 72 +-- src/path.class.js | 12 +- src/path_group.class.js | 3 +- src/point.class.js | 72 +-- src/polygon.class.js | 5 +- src/polyline.class.js | 2 +- src/rect.class.js | 2 +- src/static_canvas.class.js | 64 +-- src/text.class.js | 21 +- src/triangle.class.js | 34 +- src/util/anim_ease.js | 76 +-- src/util/dom_event.js | 16 +- src/util/dom_misc.js | 71 +-- src/util/dom_request.js | 38 +- src/util/dom_style.js | 4 +- src/util/lang_array.js | 18 +- src/util/lang_class.js | 10 +- src/util/lang_function.js | 22 +- src/util/misc.js | 19 +- 39 files changed, 1019 insertions(+), 923 deletions(-) create mode 100644 .jshintrc diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 00000000..515294e0 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,40 @@ +{ + "globals": { + "__fontDefinitions": true, + "Cufon": true, + "G_vmlCanvasManager": true, + "fabric": true, + "ActiveXObject": true + }, + + "node": true, + "es5": false, + "browser": true, + + "boss": false, + "curly": false, + "debug": false, + "devel": false, + "eqeqeq": true, + "eqnull": true, + "evil": true, + "expr": true, + "forin": false, + "immed": true, + "laxbreak": true, + "loopfunc": true, + "multistr": true, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "unused": true +} \ No newline at end of file diff --git a/HEADER.js b/HEADER.js index e1c1f55d..d2345393 100644 --- a/HEADER.js +++ b/HEADER.js @@ -1,6 +1,6 @@ /*! Fabric.js Copyright 2008-2012, Printio (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: "0.9.13" }; +var fabric = fabric || { version: "0.9.14" }; if (typeof exports != 'undefined') { exports.fabric = fabric; diff --git a/dist/all.js b/dist/all.js index e5e6767e..e17e8ce2 100644 --- a/dist/all.js +++ b/dist/all.js @@ -1,7 +1,7 @@ /* build: `node build.js modules=ALL` */ /*! Fabric.js Copyright 2008-2012, Printio (Juriy Zaytsev, Maxim Chernyak) */ -var fabric = fabric || { version: "0.9.13" }; +var fabric = fabric || { version: "0.9.14" }; if (typeof exports != 'undefined') { exports.fabric = fabric; @@ -1796,7 +1796,7 @@ fabric.Observable = { */ fire: function(eventName, options) { if (!this.__eventListeners) { - this.__eventListeners = { } + this.__eventListeners = { }; } var listenersForEvent = this.__eventListeners[eventName]; if (!listenersForEvent) return; @@ -1842,7 +1842,7 @@ fabric.Observable.off = fabric.Observable.stopObserving; array.splice(idx, 1); } return array; - }; + } /** * Returns random number between 2 specified ones. @@ -1914,19 +1914,19 @@ fabric.Observable.off = fabric.Observable.stopObserving; var start = +new Date(), duration = options.duration || 500, - finish = start + duration, time, pos, + finish = start + duration, time, onChange = options.onChange || function() { }, abort = options.abort || function() { return false; }, easing = options.easing || function(t, b, c, d) {return -c * Math.cos(t/d * (Math.PI/2)) + c + b;}, startValue = 'startValue' in options ? options.startValue : 0, - endValue = 'endValue' in options ? options.endValue : 100; + endValue = 'endValue' in options ? options.endValue : 100, byValue = options.byValue || endValue - startValue; options.onStart && options.onStart(); (function tick() { time = +new Date(); - currentTime = time > finish ? duration : (time - start); + var currentTime = time > finish ? duration : (time - start); onChange(easing(currentTime, startValue, byValue, duration)); if (time > finish || abort()) { options.onComplete && options.onComplete(); @@ -1941,7 +1941,7 @@ fabric.Observable.off = fabric.Observable.stopObserving; fabric.window.mozRequestAnimationFrame || fabric.window.oRequestAnimationFrame || fabric.window.msRequestAnimationFrame || - function(callback, element) { + function(callback) { fabric.window.setTimeout(callback, 1000 / 60); }; /** @@ -2014,6 +2014,15 @@ fabric.Observable.off = fabric.Observable.stopObserving; }); } + /** + * Groups SVG elements (usually those retrieved from SVG document) + * @static + * @memberOf fabric.util + * @method groupSVGElements + * @param {Array} elements + * @param {Object} options optional + * @return {String} path optional + */ function groupSVGElements(elements, options, path) { var object = elements.length > 1 ? new fabric.PathGroup(elements, options) @@ -2037,9 +2046,9 @@ fabric.Observable.off = fabric.Observable.stopObserving; fabric.util.groupSVGElements = groupSVGElements; })(); (function() { - + var slice = Array.prototype.slice; - + if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { if (this === void 0 || this === null) { @@ -2069,7 +2078,7 @@ fabric.Observable.off = fabric.Observable.stopObserving; } } return -1; - } + }; } if (!Array.prototype.forEach) { @@ -2077,7 +2086,7 @@ fabric.Observable.off = fabric.Observable.stopObserving; for (var i = 0, len = this.length >>> 0; i < len; i++) { if (i in this) { fn.call(context, this[i], i, this); - } + } } }; } @@ -2186,8 +2195,8 @@ fabric.Observable.off = fabric.Observable.stopObserving; */ function max(array, byProperty) { if (!array || array.length === 0) return undefined; - - var i = array.length - 1, + + var i = array.length - 1, result = byProperty ? array[i][byProperty] : array[i]; if (byProperty) { while (i--) { @@ -2215,8 +2224,8 @@ fabric.Observable.off = fabric.Observable.stopObserving; */ function min(array, byProperty) { if (!array || array.length === 0) return undefined; - - var i = array.length - 1, + + var i = array.length - 1, result = byProperty ? array[i][byProperty] : array[i]; if (byProperty) { @@ -2242,7 +2251,7 @@ fabric.Observable.off = fabric.Observable.stopObserving; min: min, max: max }; - + })(); (function(){ @@ -2333,11 +2342,11 @@ fabric.util.string = { }()); (function() { - + var slice = Array.prototype.slice, apply = Function.prototype.apply, - dummy = function() { }; - + Dummy = function() { }; + if (!Function.prototype.bind) { /** * Cross-browser approximation of ES5 Function.prototype.bind (not fully spec conforming) @@ -2349,22 +2358,22 @@ fabric.util.string = { Function.prototype.bind = function(thisArg) { var fn = this, args = slice.call(arguments, 1), bound; if (args.length) { - bound = function() { - return apply.call(fn, this instanceof dummy ? this : thisArg, args.concat(slice.call(arguments))); + bound = function() { + return apply.call(fn, this instanceof Dummy ? this : thisArg, args.concat(slice.call(arguments))); }; } else { - bound = function() { - return apply.call(fn, this instanceof dummy ? this : thisArg, arguments); + bound = function() { + return apply.call(fn, this instanceof Dummy ? this : thisArg, arguments); }; } - dummy.prototype = this.prototype; - bound.prototype = new dummy; - + Dummy.prototype = this.prototype; + bound.prototype = new Dummy(); + return bound; }; } - + })(); (function() { @@ -2381,7 +2390,7 @@ fabric.util.string = { var addMethods = function(klass, source, parent) { for (var property in source) { - if (property in klass.prototype && typeof klass.prototype[property] == 'function') { + if (property in klass.prototype && typeof klass.prototype[property] === 'function') { klass.prototype[property] = (function(property) { return function() { @@ -2394,7 +2403,7 @@ fabric.util.string = { if (property !== 'initialize') { return returnValue; } - } + }; })(property); } else { @@ -2412,7 +2421,7 @@ fabric.util.string = { } }; - function subclass() { }; + function Subclass() { } /** * Helper for creation of "classes" @@ -2434,8 +2443,8 @@ fabric.util.string = { klass.subclasses = [ ]; if (parent) { - subclass.prototype = parent.prototype; - klass.prototype = new subclass; + Subclass.prototype = parent.prototype; + klass.prototype = new Subclass(); parent.subclasses.push(klass); } for (var i = 0, length = properties.length; i < length; i++) { @@ -2450,7 +2459,7 @@ fabric.util.string = { fabric.util.createClass = createClass; })(); -(function (global) { +(function () { /* EVENT HANDLING */ @@ -2635,26 +2644,26 @@ fabric.util.string = { return { x: pointerX(event), y: pointerY(event) }; } - function pointerX(event) { + var pointerX = function(event) { var docElement = fabric.document.documentElement, body = fabric.document.body || { scrollLeft: 0 }; // looks like in IE (<9) clientX at certain point (apparently when mouseup fires on VML element) // is represented as COM object, with all the consequences, like "unknown" type and error on [[Get]] // need to investigate later - return event.pageX || ((typeof event.clientX != 'unknown' ? event.clientX : 0) + + return event.pageX || ((typeof event.clientX !== 'unknown' ? event.clientX : 0) + (docElement.scrollLeft || body.scrollLeft) - (docElement.clientLeft || 0)); - } + }; - function pointerY(event) { + var pointerY = function(event) { var docElement = fabric.document.documentElement, body = fabric.document.body || { scrollTop: 0 }; - return event.pageY || ((typeof event.clientY != 'unknown' ? event.clientY : 0) + + return event.pageY || ((typeof event.clientY !== 'unknown' ? event.clientY : 0) + (docElement.scrollTop || body.scrollTop) - (docElement.clientTop || 0)); - } + }; if (fabric.isTouchSupported) { pointerX = function(event) { @@ -2669,7 +2678,7 @@ fabric.util.string = { fabric.util.object.extend(fabric.util, fabric.Observable); -})(this); +})(); (function () { /** @@ -2681,7 +2690,7 @@ fabric.util.string = { * @return {HTMLElement} Element that was passed as a first argument */ function setStyle(element, styles) { - var elementStyle = element.style, match; + var elementStyle = element.style; if (!elementStyle) { return element; } @@ -2708,8 +2717,6 @@ fabric.util.string = { var parseEl = fabric.document.createElement('div'), supportsOpacity = typeof parseEl.style.opacity === 'string', supportsFilters = typeof parseEl.style.filter === 'string', - view = fabric.document.defaultView, - supportsGCS = view && typeof view.getComputedStyle !== 'undefined', reOpacity = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/, /** @ignore */ @@ -2744,7 +2751,7 @@ fabric.util.string = { })(); (function() { - + var _slice = Array.prototype.slice; /** @@ -2765,12 +2772,13 @@ fabric.util.string = { * @param {Object} arrayLike * @return {Array} */ - function toArray(arrayLike) { + var toArray = function(arrayLike) { return _slice.call(arrayLike, 0); - } + }; + var sliceCanConvertNodelists; try { - var sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array; + sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array; } catch(err) { } @@ -2818,7 +2826,7 @@ fabric.util.string = { function addClass(element, className) { if ((' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) { element.className += (element.className ? ' ' : '') + className; - } + } } /** @@ -2856,7 +2864,7 @@ fabric.util.string = { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; - } + } while (element); return ({ left: valueL, top: valueT }); } @@ -2866,12 +2874,12 @@ fabric.util.string = { var selectProp = 'userSelect' in style ? 'userSelect' - : 'MozUserSelect' in style - ? 'MozUserSelect' - : 'WebkitUserSelect' in style - ? 'WebkitUserSelect' - : 'KhtmlUserSelect' in style - ? 'KhtmlUserSelect' + : 'MozUserSelect' in style + ? 'MozUserSelect' + : 'WebkitUserSelect' in style + ? 'WebkitUserSelect' + : 'KhtmlUserSelect' in style + ? 'KhtmlUserSelect' : ''; /** @@ -2888,7 +2896,7 @@ fabric.util.string = { if (selectProp) { element.style[selectProp] = 'none'; } - else if (typeof element.unselectable == 'string') { + else if (typeof element.unselectable === 'string') { element.unselectable = 'on'; } return element; @@ -2908,7 +2916,7 @@ fabric.util.string = { if (selectProp) { element.style[selectProp] = ''; } - else if (typeof element.unselectable == 'string') { + else if (typeof element.unselectable === 'string') { element.unselectable = ''; } return element; @@ -2928,28 +2936,28 @@ fabric.util.string = { * @param {Function} callback Callback to execute when script is finished loading */ function getScript(url, callback) { - var headEl = fabric.document.getElementsByTagName("head")[0], - scriptEl = fabric.document.createElement('script'), - loading = true; + var headEl = fabric.document.getElementsByTagName("head")[0], + scriptEl = fabric.document.createElement('script'), + loading = true; - scriptEl.type = 'text/javascript'; - scriptEl.setAttribute('runat', 'server'); + scriptEl.type = 'text/javascript'; + scriptEl.setAttribute('runat', 'server'); - /** @ignore */ - scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) { - if (loading) { - if (typeof this.readyState == 'string' && - this.readyState !== 'loaded' && - this.readyState !== 'complete') return; - loading = false; - callback(e || fabric.window.event); - scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null; - } - }; - scriptEl.src = url; - headEl.appendChild(scriptEl); - // causes issue in Opera - // headEl.removeChild(scriptEl); + /** @ignore */ + scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) { + if (loading) { + if (typeof this.readyState === 'string' && + this.readyState !== 'loaded' && + this.readyState !== 'complete') return; + loading = false; + callback(e || fabric.window.event); + scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null; + } + }; + scriptEl.src = url; + headEl.appendChild(scriptEl); + // causes issue in Opera + // headEl.removeChild(scriptEl); } fabric.util.getScript = getScript; @@ -2961,14 +2969,14 @@ fabric.util.string = { fabric.util.addClass = addClass; fabric.util.wrapElement = wrapElement; fabric.util.getElementOffset = getElementOffset; - + })(); (function(){ - + function addParamToUrl(url, param) { return url + (/\?/.test(url) ? '&' : '?') + param; } - + var makeXHR = (function() { var factories = [ function() { return new ActiveXObject("Microsoft.XMLHTTP"); }, @@ -2987,8 +2995,8 @@ fabric.util.string = { } })(); - function emptyFn() { }; - + function emptyFn() { } + /** * Cross-browser abstraction for sending XMLHttpRequest * @method request @@ -3005,34 +3013,34 @@ fabric.util.string = { var method = options.method ? options.method.toUpperCase() : 'GET', onComplete = options.onComplete || function() { }, - request = makeXHR(), + xhr = makeXHR(), body; - + /** @ignore */ - request.onreadystatechange = function() { - if (request.readyState === 4) { - onComplete(request); - request.onreadystatechange = emptyFn; + xhr.onreadystatechange = function() { + if (xhr.readyState === 4) { + onComplete(xhr); + xhr.onreadystatechange = emptyFn; } }; - + if (method === 'GET') { body = null; - if (typeof options.parameters == 'string') { + if (typeof options.parameters === 'string') { url = addParamToUrl(url, options.parameters); } } - request.open(method, url, true); - + xhr.open(method, url, true); + if (method === 'POST' || method === 'PUT') { - request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } - request.send(body); - return request; - }; - + xhr.send(body); + return xhr; + } + fabric.util.request = request; })(); (function() { @@ -3058,7 +3066,8 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInOutQuad(t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t + b; + t /= (d/2); + if (t < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; } @@ -3083,7 +3092,8 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInOutCubic(t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t + b; + t /= d/2; + if (t < 1) return c/2*t*t*t + b; return c/2*((t-=2)*t*t + 2) + b; } @@ -3108,7 +3118,8 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInOutQuart(t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + t /= d/2; + if (t < 1) return c/2*t*t*t*t + b; return -c/2 * ((t-=2)*t*t*t - 2) + b; } @@ -3133,7 +3144,8 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInOutQuint(t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + t /= d/2; + if (t < 1) return c/2*t*t*t*t*t + b; return c/2*((t-=2)*t*t*t*t + 2) + b; } @@ -3166,7 +3178,7 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInExpo(t, b, c, d) { - return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + return (t===0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; } /** @@ -3174,7 +3186,7 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeOutExpo(t, b, c, d) { - return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + return (t===d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; } /** @@ -3182,9 +3194,10 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInOutExpo(t, b, c, d) { - if (t==0) return b; - if (t==d) return b+c; - if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + if (t===0) return b; + if (t===d) return b+c; + t /= d/2; + if (t < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; } @@ -3209,7 +3222,8 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInOutCirc(t, b, c, d) { - if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + t /= d/2; + if (t < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; } @@ -3219,9 +3233,12 @@ fabric.util.string = { */ function easeInElastic(t, b, c, d) { var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t===0) return b; + t /= d; + if (t===1) return b+c; + if (!p) p=d*0.3; + if (a < Math.abs(c)) { a=c; s=p/4; } + else s = p/(2*Math.PI) * Math.asin (c/a); return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; } @@ -3231,9 +3248,12 @@ fabric.util.string = { */ function easeOutElastic(t, b, c, d) { var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t===0) return b; + t /= d; + if (t===1) return b+c; + if (!p) p=d*0.3; + if (a < Math.abs(c)) { a=c; s=p/4; } + else s = p/(2*Math.PI) * Math.asin (c/a); return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; } @@ -3243,11 +3263,14 @@ fabric.util.string = { */ function easeInOutElastic(t, b, c, d) { var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); - if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; - return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + if (t===0) return b; + t /= d/2; + if (t===2) return b+c; + if (!p) p=d*(0.3*1.5); + if (a < Math.abs(c)) { a=c; s=p/4; } + else s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -0.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b; } /** @@ -3255,7 +3278,7 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInBack(t, b, c, d, s) { - if (s == undefined) s = 1.70158; + if (s === undefined) s = 1.70158; return c*(t/=d)*t*((s+1)*t - s) + b; } @@ -3264,7 +3287,7 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeOutBack(t, b, c, d, s) { - if (s == undefined) s = 1.70158; + if (s === undefined) s = 1.70158; return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; } @@ -3273,8 +3296,9 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInOutBack(t, b, c, d, s) { - if (s == undefined) s = 1.70158; - if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + if (s === undefined) s = 1.70158; + t /= d/2; + if (t < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; } @@ -3294,11 +3318,11 @@ fabric.util.string = { if ((t/=d) < (1/2.75)) { return c*(7.5625*t*t) + b; } else if (t < (2/2.75)) { - return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b; } else if (t < (2.5/2.75)) { - return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b; } else { - return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b; } } @@ -3307,8 +3331,8 @@ fabric.util.string = { * @memberOf fabric.util.ease */ function easeInOutBounce(t, b, c, d) { - if (t < d/2) return easeInBounce (t*2, 0, c, d) * .5 + b; - return easeOutBounce (t*2-d, 0, c, d) * .5 + c*.5 + b; + if (t < d/2) return easeInBounce (t*2, 0, c, d) * 0.5 + b; + return easeOutBounce (t*2-d, 0, c, d) * 0.5 + c*0.5 + b; } /** @namespace fabric.util.ease */ @@ -3435,7 +3459,7 @@ fabric.util.string = { ownAttributes = extend(ownAttributes, extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element))); return extend(parentAttributes, ownAttributes); - }; + } /** * Parses "transform" attribute, returning an array of values @@ -3566,9 +3590,9 @@ fabric.util.string = { matrix = args; break; } - }) + }); return matrix; - } + }; })(); /** @@ -3588,17 +3612,21 @@ fabric.util.string = { var asPairs = points.indexOf(',') > -1; points = points.split(/\s+/); - var parsedPoints = [ ]; + var parsedPoints = [ ], i, len; // points could look like "10,20 30,40" or "10 20 30 40" if (asPairs) { - for (var i = 0, len = points.length; i < len; i++) { - var pair = points[i].split(','); - parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); - } + i = 0; + len = points.length; + for (; i < len; i++) { + var pair = points[i].split(','); + parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); + } } else { - for (var i = 0, len = points.length; i < len; i+=2) { + i = 0; + len = points.length; + for (; i < len; i+=2) { parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) }); } } @@ -3609,7 +3637,7 @@ fabric.util.string = { } return parsedPoints; - }; + } /** * Parses "style" attribute, retuning an object with values @@ -3622,22 +3650,24 @@ fabric.util.string = { function parseStyleAttribute(element) { var oStyle = { }, style = element.getAttribute('style'); - if (style) { - if (typeof style == 'string') { - style = style.replace(/;$/, '').split(';').forEach(function (current) { - var attr = current.split(':'); - oStyle[normalizeAttr(attr[0].trim().toLowerCase())] = attr[1].trim(); - }); - } else { - for (var prop in style) { - if (typeof style[prop] !== 'undefined') { - oStyle[normalizeAttr(prop.toLowerCase())] = style[prop]; - } - } + + if (!style) return oStyle; + + if (typeof style === 'string') { + style = style.replace(/;$/, '').split(';').forEach(function (current) { + var attr = current.split(':'); + oStyle[normalizeAttr(attr[0].trim().toLowerCase())] = attr[1].trim(); + }); + } + else { + for (var prop in style) { + if (typeof style[prop] === 'undefined') continue; + oStyle[normalizeAttr(prop.toLowerCase())] = style[prop]; } } + return oStyle; - }; + } function resolveGradients(instances) { for (var i = instances.length; i--; ) { @@ -3666,7 +3696,7 @@ fabric.util.string = { * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. */ function parseElements(elements, callback, options, reviver) { - var instances = Array(elements.length), i = elements.length; + var instances = new Array(elements.length), i = elements.length; function checkIfDone() { if (--i === 0) { @@ -3707,7 +3737,7 @@ fabric.util.string = { checkIfDone(); } } - }; + } /** * Returns CSS rules for a given SVG document @@ -3731,12 +3761,12 @@ fabric.util.string = { styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); - rules = rules.map(function(rule) { return rule.trim() }); + rules = rules.map(function(rule) { return rule.trim(); }); rules.forEach(function(rule) { - var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/), - rule = match[1], - declaration = match[2].trim(), + var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/); + rule = match[1]; + var declaration = match[2].trim(), propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); if (!allRules[rule]) { @@ -3898,7 +3928,7 @@ fabric.util.string = { * @param {String} url * @param {Function} callback */ - get: function (url, callback) { + get: function () { /* NOOP */ }, @@ -3907,7 +3937,7 @@ fabric.util.string = { * @param {String} url * @param {Object} object */ - set: function (url, object) { + set: function () { /* NOOP */ } }; @@ -3991,7 +4021,7 @@ fabric.util.string = { } } else if (fabric.window.ActiveXObject) { - var doc = new ActiveXObject('Microsoft.XMLDOM'); + doc = new ActiveXObject('Microsoft.XMLDOM'); doc.async = 'false'; //IE chokes on DOCTYPE doc.loadXML(string.replace(//i,'')); @@ -4045,7 +4075,7 @@ fabric.util.string = { createSVGFontFacesMarkup: createSVGFontFacesMarkup }); -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function() { @@ -4140,10 +4170,8 @@ fabric.util.string = { */ var colorStopEls = el.getElementsByTagName('stop'), - el, offset, colorStops = { }, - colorStopFromStyle, coords = { x1: el.getAttribute('x1') || 0, y1: el.getAttribute('y1') || 0, @@ -4215,15 +4243,17 @@ fabric.util.string = { function getGradientDefs(doc) { var linearGradientEls = doc.getElementsByTagName('linearGradient'), radialGradientEls = doc.getElementsByTagName('radialGradient'), - el, + el, i, gradientDefs = { }; - for (var i = linearGradientEls.length; i--; ) { + i = linearGradientEls.length; + for (; i--; ) { el = linearGradientEls[i]; gradientDefs[el.getAttribute('id')] = el; } - for (var i = radialGradientEls.length; i--; ) { + i = radialGradientEls.length; + for (; i--; ) { el = radialGradientEls[i]; gradientDefs[el.getAttribute('id')] = el; } @@ -4235,20 +4265,20 @@ fabric.util.string = { })(); (function(global) { - + "use strict"; - + /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */ - + var fabric = global.fabric || (global.fabric = { }); - if (fabric.Point) { + if (fabric.Point) { fabric.warn('fabric.Point is already defined'); return; } fabric.Point = Point; - + /** * @name Point * @memberOf fabric @@ -4262,11 +4292,11 @@ fabric.util.string = { this.init(x, y); } } - + Point.prototype = /** @scope fabric.Point.prototype */ { - + constructor: Point, - + /** * @method init * @param {Number} x @@ -4276,7 +4306,7 @@ fabric.util.string = { this.x = x; this.y = y; }, - + /** * @method add * @param {fabric.Point} that @@ -4285,7 +4315,7 @@ fabric.util.string = { add: function (that) { return new Point(this.x + that.x, this.y + that.y); }, - + /** * @method addEquals * @param {fabric.Point} that @@ -4296,7 +4326,7 @@ fabric.util.string = { this.y += that.y; return this; }, - + /** * @method scalarAdd * @param {Number} scalar @@ -4305,7 +4335,7 @@ fabric.util.string = { scalarAdd: function (scalar) { return new Point(this.x + scalar, this.y + scalar); }, - + /** * @method scalarAddEquals * @param {Number} scalar @@ -4316,7 +4346,7 @@ fabric.util.string = { this.y += scalar; return this; }, - + /** * @method subtract * @param {fabric.Point} that @@ -4325,7 +4355,7 @@ fabric.util.string = { subtract: function (that) { return new Point(this.x - that.x, this.y - that.y); }, - + /** * @method subtractEquals * @param {fabric.Point} that @@ -4336,89 +4366,89 @@ fabric.util.string = { this.y -= that.y; return this; }, - + scalarSubtract: function (scalar) { return new Point(this.x - scalar, this.y - scalar); }, - + scalarSubtractEquals: function (scalar) { this.x -= scalar; this.y -= scalar; return this; }, - + multiply: function (scalar) { return new Point(this.x * scalar, this.y * scalar); }, - + multiplyEquals: function (scalar) { this.x *= scalar; this.y *= scalar; return this; }, - + divide: function (scalar) { return new Point(this.x / scalar, this.y / scalar); }, - + divideEquals: function (scalar) { this.x /= scalar; this.y /= scalar; return this; }, - + eq: function (that) { - return (this.x == that.x && this.y == that.y); + return (this.x === that.x && this.y === that.y); }, - + lt: function (that) { return (this.x < that.x && this.y < that.y); }, - + lte: function (that) { return (this.x <= that.x && this.y <= that.y); }, - + gt: function (that) { return (this.x > that.x && this.y > that.y); }, - + gte: function (that) { return (this.x >= that.x && this.y >= that.y); }, - + lerp: function (that, t) { return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t); }, - + distanceFrom: function (that) { var dx = this.x - that.x, dy = this.y - that.y; return Math.sqrt(dx * dx + dy * dy); }, - + min: function (that) { return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y)); }, - + max: function (that) { return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y)); }, - + toString: function () { return this.x + "," + this.y; }, - + setXY: function (x, y) { this.x = x; this.y = y; }, - + setFromPoint: function (that) { this.x = that.x; this.y = that.y; }, - + swap: function (that) { var x = this.x, y = this.y; @@ -4428,8 +4458,8 @@ fabric.util.string = { that.y = y; } }; - -})(typeof exports != 'undefined' ? exports : this); + +})(typeof exports !== 'undefined' ? exports : this); (function(global) { "use strict"; @@ -4492,7 +4522,7 @@ fabric.util.string = { ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x), ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x), u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); - if (u_b != 0) { + if (u_b !== 0) { var ua = ua_t / u_b, ub = ub_t / u_b; if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { @@ -4504,7 +4534,7 @@ fabric.util.string = { } } else { - if (ua_t == 0 || ub_t == 0) { + if (ua_t === 0 || ub_t === 0) { result = new Intersection("Coincident"); } else { @@ -4578,18 +4608,18 @@ fabric.util.string = { return result; }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { - + "use strict"; - + var fabric = global.fabric || (global.fabric = { }); - + if (fabric.Color) { fabric.warn('fabric.Color is already defined.'); return; } - + /** * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations; * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects. @@ -4606,11 +4636,11 @@ fabric.util.string = { this._tryParsingColor(color); } } - + fabric.Color = Color; - + fabric.Color.prototype = /** @scope fabric.Color.prototype */ { - + /** * @private * @method _tryParsingColor @@ -4672,19 +4702,19 @@ fabric.util.string = { var source = this.getSource(); var r = source[0].toString(16); - r = (r.length == 1) ? ('0' + r) : r; + r = (r.length === 1) ? ('0' + r) : r; var g = source[1].toString(16); - g = (g.length == 1) ? ('0' + g) : g; + g = (g.length === 1) ? ('0' + g) : g; var b = source[2].toString(16); - b = (b.length == 1) ? ('0' + b) : b; + b = (b.length === 1) ? ('0' + b) : b; return r.toUpperCase() + g.toUpperCase() + b.toUpperCase(); }, /** - * Gets value of alpha channel for this color + * Gets value of alpha channel for this color * @method getAlpha * @return {Number} 0-1 */ @@ -4726,8 +4756,9 @@ fabric.util.string = { toBlackWhite: function(threshold) { var source = this.getSource(), average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), - currentAlpha = source[3], - threshold = threshold || 127; + currentAlpha = source[3]; + + threshold = threshold || 127; average = (Number(average) < Number(threshold)) ? 0 : 255; this.setSource([average, average, average, currentAlpha]); @@ -4760,14 +4791,14 @@ fabric.util.string = { return this; } }; - + /** * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgb(255, 100, 10, 0.5), rgb(1,1,1)) * @static * @field */ fabric.Color.reRGBa = /^rgba?\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})(?:\s*,\s*(\d+(?:\.\d+)?))?\)$/; - + /** * Regex matching color in HEX format (ex: #FF5555, 010155, aff) * @static @@ -4784,7 +4815,7 @@ fabric.util.string = { fabric.Color.fromRgb = function(color) { return Color.fromSource(Color.sourceFromRgb(color)); }; - + /** * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format * @method sourceFromRgb @@ -4822,7 +4853,7 @@ fabric.util.string = { fabric.Color.fromHex = function(color) { return Color.fromSource(Color.sourceFromHex(color)); }; - + /** * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in HEX format * @static @@ -4846,7 +4877,7 @@ fabric.util.string = { ]; } }; - + /** * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5]) * @static @@ -4859,8 +4890,8 @@ fabric.util.string = { return oColor; }; -})(typeof exports != 'undefined' ? exports : this); -(function (global) { +})(typeof exports !== 'undefined' ? exports : this); +(function () { "use strict"; @@ -4965,7 +4996,7 @@ fabric.util.string = { * @method onBeforeScaleRotate * @param {fabric.Object} target Object that's about to be scaled/rotated */ - onBeforeScaleRotate: function (target) { + onBeforeScaleRotate: function () { /* NOOP */ }, @@ -5343,39 +5374,24 @@ fabric.util.string = { this.clearContext(canvasToDrawOn); } - var length = this._objects.length, - activeGroup = this.getActiveGroup(), + var activeGroup = this.getActiveGroup(), startTime = new Date(); if (this.clipTo) { - canvasToDrawOn.save(); - canvasToDrawOn.beginPath(); - this.clipTo(canvasToDrawOn); - canvasToDrawOn.clip(); + this._clipCanvas(canvasToDrawOn); } canvasToDrawOn.fillStyle = this.backgroundColor; canvasToDrawOn.fillRect(0, 0, this.width, this.height); - if (typeof this.backgroundImage == 'object') { - canvasToDrawOn.save(); - canvasToDrawOn.globalAlpha = this.backgroundImageOpacity; - - if (this.backgroundImageStretch) { - canvasToDrawOn.drawImage(this.backgroundImage, 0, 0, this.width, this.height); - } - else { - canvasToDrawOn.drawImage(this.backgroundImage, 0, 0); - } - canvasToDrawOn.restore(); + if (typeof this.backgroundImage === 'object') { + this._drawBackroundImage(canvasToDrawOn); } - if (length) { - for (var i = 0; i < length; ++i) { - if (!activeGroup || - (activeGroup && this._objects[i] && !activeGroup.contains(this._objects[i]))) { - this._draw(canvasToDrawOn, this._objects[i]); - } + for (var i = 0, length = this._objects.length; i < length; ++i) { + if (!activeGroup || + (activeGroup && this._objects[i] && !activeGroup.contains(this._objects[i]))) { + this._draw(canvasToDrawOn, this._objects[i]); } } @@ -5406,6 +5422,26 @@ fabric.util.string = { return this; }, + _clipCanvas: function(canvasToDrawOn) { + canvasToDrawOn.save(); + canvasToDrawOn.beginPath(); + this.clipTo(canvasToDrawOn); + canvasToDrawOn.clip(); + }, + + _drawBackroundImage: function(canvasToDrawOn) { + canvasToDrawOn.save(); + canvasToDrawOn.globalAlpha = this.backgroundImageOpacity; + + if (this.backgroundImageStretch) { + canvasToDrawOn.drawImage(this.backgroundImage, 0, 0, this.width, this.height); + } + else { + canvasToDrawOn.drawImage(this.backgroundImage, 0, 0); + } + canvasToDrawOn.restore(); + }, + /** * Method to render only the top canvas. * Also used to render the group selection box. @@ -5638,8 +5674,9 @@ fabric.util.string = { var data = { objects: this._objects.map(function (instance) { // TODO (kangax): figure out how to clean this up + var originalValue; if (!this.includeDefaultValues) { - var originalValue = instance.includeDefaultValues; + originalValue = instance.includeDefaultValues; instance.includeDefaultValues = false; } var object = instance[methodName](); @@ -5964,9 +6001,9 @@ fabric.util.string = { try { el.toDataURL('image/jpeg', 0); return true; - } catch (e) { - return false; } + catch (e) { } + return false; default: return null; @@ -5982,8 +6019,7 @@ fabric.util.string = { */ fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject; -})(typeof exports != 'undefined' ? exports : this); - +})(); (function() { var extend = fabric.util.object.extend, @@ -6032,7 +6068,7 @@ fabric.util.string = { function ProtoProxy(){ } ProtoProxy.prototype = fabric.StaticCanvas.prototype; - fabric.Canvas.prototype = new ProtoProxy; + fabric.Canvas.prototype = new ProtoProxy(); var InteractiveMethods = /** @scope fabric.Canvas.prototype */ { @@ -6175,7 +6211,7 @@ fabric.util.string = { _this.__onMouseMove(e); }; - this._onResize = function (e) { + this._onResize = function () { _this.calcOffset(); }; @@ -6202,6 +6238,8 @@ fabric.util.string = { */ __onMouseUp: function (e) { + var target; + if (this.isDrawingMode && this._isCurrentlyDrawing) { this._finalizeDrawingPath(); this.fire('mouse:up', { e: e }); @@ -6210,9 +6248,9 @@ fabric.util.string = { if (this._currentTransform) { - var transform = this._currentTransform, - target = transform.target; + var transform = this._currentTransform; + target = transform.target; if (target._scaling) { target._scaling = false; } @@ -6259,7 +6297,7 @@ fabric.util.string = { }, 50); this.fire('mouse:up', { target: target, e: e }); - target && target.fire('mouseup', { e: e }) + target && target.fire('mouseup', { e: e }); }, /** @@ -6274,7 +6312,7 @@ fabric.util.string = { __onMouseDown: function (e) { // accept only left clicks - var isLeftClick = 'which' in e ? e.which == 1 : e.button == 1; + var isLeftClick = 'which' in e ? e.which === 1 : e.button === 1; if (!isLeftClick && !fabric.isTouchSupported) return; if (this.isDrawingMode) { @@ -6310,7 +6348,7 @@ fabric.util.string = { // rotate and scale will happen at the same time this.stateful && target.saveState(); - if (corner = target._findTargetCorner(e, this._offset)) { + if ((corner = target._findTargetCorner(e, this._offset))) { this.onBeforeScaleRotate(target); } @@ -6346,6 +6384,8 @@ fabric.util.string = { */ __onMouseMove: function (e) { + var target; + if (this.isDrawingMode) { if (this._isCurrentlyDrawing) { this._captureDrawingPath(e); @@ -6354,11 +6394,12 @@ fabric.util.string = { return; } - var groupSelector = this._groupSelector; + var groupSelector = this._groupSelector, pointer; // We initially clicked in an empty area, so we draw a box for multiple selection. if (groupSelector !== null) { - var pointer = getPointer(e); + pointer = getPointer(e); + groupSelector.left = pointer.x - this._offset.left - groupSelector.ex; groupSelector.top = pointer.y - this._offset.top - groupSelector.ey; this.renderTop(); @@ -6372,7 +6413,7 @@ fabric.util.string = { // what part of the pictures we are hovering to change the caret symbol. // We won't do that while dragging or rotating in order to improve the // performance. - var target = this.findTarget(e); + target = this.findTarget(e); if (!target) { // image/text was hovered-out from, we remove its borders @@ -6394,8 +6435,9 @@ fabric.util.string = { } else { // object is being transformed (scaled/rotated/moved/etc.) - var pointer = getPointer(e), - x = pointer.x, + pointer = getPointer(e); + + var x = pointer.x, y = pointer.y; this._currentTransform.target.isMoving = true; @@ -6582,7 +6624,7 @@ fabric.util.string = { corner, pointer = getPointer(e); - if (corner = target._findTargetCorner(e, this._offset)) { + if ((corner = target._findTargetCorner(e, this._offset))) { action = (corner === 'ml' || corner === 'mr') ? 'scaleX' : (corner === 'mt' || corner === 'mb') @@ -6712,17 +6754,14 @@ fabric.util.string = { minY = utilMin(this._freeDrawingYPoints), maxX = utilMax(this._freeDrawingXPoints), maxY = utilMax(this._freeDrawingYPoints), - ctx = this.contextTop, path = [ ], - xPoint, - yPoint, xPoints = this._freeDrawingXPoints, yPoints = this._freeDrawingYPoints; path.push('M ', xPoints[0] - minX, ' ', yPoints[0] - minY, ' '); - for (var i = 1; xPoint = xPoints[i], yPoint = yPoints[i]; i++) { - path.push('L ', xPoint - minX, ' ', yPoint - minY, ' '); + for (var i = 1, len = xPoints.length; i < len; i++) { + path.push('L ', xPoints[i] - minX, ' ', yPoints[i] - minY, ' '); } // TODO (kangax): maybe remove Path creation from here, to decouple fabric.Canvas from fabric.Path, @@ -6887,9 +6926,7 @@ fabric.util.string = { }, _findSelectedObjects: function (e) { - var target, - targetRegion, - group = [ ], + var group = [ ], x1 = this._groupSelector.ex, y1 = this._groupSelector.ey, x2 = x1 + this._groupSelector.left, @@ -6918,7 +6955,7 @@ fabric.util.string = { this.setActiveObject(group[0], e); } else if (group.length > 1) { - var group = new fabric.Group(group); + group = new fabric.Group(group); this.setActiveGroup(group); group.saveCoords(); this.fire('selection:created', { target: group }); @@ -6961,11 +6998,11 @@ fabric.util.string = { } } } - for (var i = 0, len = possibleTargets.length; i < len; i++) { - var pointer = this.getPointer(e); - var isTransparent = this._isTargetTransparent(possibleTargets[i], pointer.x, pointer.y); + for (var j = 0, len = possibleTargets.length; j < len; j++) { + pointer = this.getPointer(e); + var isTransparent = this._isTargetTransparent(possibleTargets[j], pointer.x, pointer.y); if (!isTransparent) { - target = possibleTargets[i]; + target = possibleTargets[j]; this.relatedTarget = target; break; } @@ -7362,6 +7399,86 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { } } + /** @ignore */ + function loadObject(obj, index) { + + var pathProp = obj.paths ? 'paths' : 'path'; + var path = obj[pathProp]; + + delete obj[pathProp]; + + if (typeof path !== 'string') { + if (obj.type === 'image') { + fabric[fabric.util.string.capitalize(obj.type)].fromObject(obj, function (o) { + onObjectLoaded(o, index); + }); + } + else { + var klass = fabric[fabric.util.string.camelize(fabric.util.string.capitalize(obj.type))]; + if (!klass || !klass.fromObject) return; + + // restore path + if (path) { + obj[pathProp] = path; + } + onObjectLoaded(klass.fromObject(obj), index); + } + } + else { + if (obj.type === 'image') { + fabric.util.loadImage(path, function (image) { + var oImg = new fabric.Image(image); + + oImg.setSourcePath(path); + + fabric.util.object.extend(oImg, obj); + oImg.setAngle(obj.angle); + + onObjectLoaded(oImg, index); + }); + } + else if (obj.type === 'text') { + + if (obj.useNative) { + onObjectLoaded(fabric.Text.fromObject(obj), index); + } + else { + obj.path = path; + var object = fabric.Text.fromObject(obj); + var onscriptload = function () { + // TODO (kangax): find out why Opera refuses to work without this timeout + if (Object.prototype.toString.call(fabric.window.opera) === '[object Opera]') { + setTimeout(function () { + onObjectLoaded(object, index); + }, 500); + } + else { + onObjectLoaded(object, index); + } + }; + + fabric.util.getScript(path, onscriptload); + } + } + else { + fabric.loadSVGFromURL(path, function (elements) { + var object = fabric.util.groupSVGElements(elements, obj, path); + + // copy parameters from serialied json to object (left, top, scaleX, scaleY, etc.) + // skip this step if an object is a PathGroup, since we already passed it options object before + if (!(object instanceof fabric.PathGroup)) { + fabric.util.object.extend(object, obj); + if (typeof obj.angle !== 'undefined') { + object.setAngle(obj.angle); + } + } + + onObjectLoaded(object, index); + }); + } + } + } + var _this = this, numLoadedObjects = 0, numTotalObjects = objects.length; @@ -7371,86 +7488,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { } try { - objects.forEach(function (obj, index) { - - var pathProp = obj.paths ? 'paths' : 'path'; - var path = obj[pathProp]; - - delete obj[pathProp]; - - if (typeof path !== 'string') { - switch (obj.type) { - case 'image': - fabric[fabric.util.string.capitalize(obj.type)].fromObject(obj, function (o) { - onObjectLoaded(o, index); - }); - break; - default: - var klass = fabric[fabric.util.string.camelize(fabric.util.string.capitalize(obj.type))]; - if (klass && klass.fromObject) { - // restore path - if (path) { - obj[pathProp] = path; - } - onObjectLoaded(klass.fromObject(obj), index); - } - break; - } - } - else { - if (obj.type === 'image') { - fabric.util.loadImage(path, function (image) { - var oImg = new fabric.Image(image); - - oImg.setSourcePath(path); - - fabric.util.object.extend(oImg, obj); - oImg.setAngle(obj.angle); - - onObjectLoaded(oImg, index); - }); - } - else if (obj.type === 'text') { - - if (obj.useNative) { - onObjectLoaded(fabric.Text.fromObject(obj), index); - } - else { - obj.path = path; - var object = fabric.Text.fromObject(obj); - var onscriptload = function () { - // TODO (kangax): find out why Opera refuses to work without this timeout - if (Object.prototype.toString.call(fabric.window.opera) === '[object Opera]') { - setTimeout(function () { - onObjectLoaded(object, index); - }, 500); - } - else { - onObjectLoaded(object, index); - } - } - - fabric.util.getScript(path, onscriptload); - } - } - else { - fabric.loadSVGFromURL(path, function (elements, options) { - var object = fabric.util.groupSVGElements(elements, obj, path); - - // copy parameters from serialied json to object (left, top, scaleX, scaleY, etc.) - // skip this step if an object is a PathGroup, since we already passed it options object before - if (!(object instanceof fabric.PathGroup)) { - fabric.util.object.extend(object, obj); - if (typeof obj.angle !== 'undefined') { - object.setAngle(obj.angle); - } - } - - onObjectLoaded(object, index); - }); - } - } - }, this); + objects.forEach(loadObject, this); } catch(e) { fabric.log(e.message); @@ -7586,7 +7624,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, - clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, capitalize = fabric.util.string.capitalize, getPointer = fabric.util.getPointer, @@ -7840,7 +7877,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { * @method initGradient */ _initGradient: function(options) { - if (options.fill && typeof options.fill == 'object' && !(options.fill instanceof fabric.Gradient)) { + if (options.fill && typeof options.fill === 'object' && !(options.fill instanceof fabric.Gradient)) { this.set('fill', new fabric.Gradient(options.fill)); } }, @@ -8374,8 +8411,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { : -h - (strokeWidth * this.scaleY) - (padding * 2) ) / 2; - var rotateWidth = (-w/2); - ctx.beginPath(); ctx.moveTo(0, rotateHeight); ctx.lineTo(0, rotateHeight + (this.flipY ? this.rotatingPointOffset : -this.rotatingPointOffset)); @@ -8398,8 +8433,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { x = -this.width/2, y = -this.height/2, _this = this, padding = this.padding, - width = this.getWidth(), - height = this.getHeight(), dashedArrayLength = this.strokeDashArray.length; ctx.save(); @@ -8408,6 +8441,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { function renderSide(xMultiplier, yMultiplier) { var lineLength = 0, + lengthDiff = 0, sideLength = (yMultiplier ? _this.height : _this.width) + padding * 2; while (lineLength < sideLength) { @@ -8416,7 +8450,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { lineLength += lengthOfSubPath; if (lineLength > sideLength) { - var lengthDiff = lineLength - sideLength; + lengthDiff = lineLength - sideLength; } // track coords @@ -8612,7 +8646,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { */ toDataURL: function(callback) { var el = fabric.document.createElement('canvas'); - if (!el.getContext && typeof G_vmlCanvasManager != 'undefined') { + if (!el.getContext && typeof G_vmlCanvasManager !== 'undefined') { G_vmlCanvasManager.initElement(el); } @@ -8714,7 +8748,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { tr: new fabric.Point(oCoords.tr.x, oCoords.tr.y), bl: new fabric.Point(oCoords.bl.x, oCoords.bl.y), br: new fabric.Point(oCoords.br.x, oCoords.br.y) - } + }; } var thisCoords = getCoords(this.oCoords), otherCoords = getCoords(other.oCoords); @@ -8748,8 +8782,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var oCoords = this.oCoords, tl = new fabric.Point(oCoords.tl.x, oCoords.tl.y), tr = new fabric.Point(oCoords.tr.x, oCoords.tr.y), - bl = new fabric.Point(oCoords.bl.x, oCoords.bl.y), - br = new fabric.Point(oCoords.br.x, oCoords.br.y); + bl = new fabric.Point(oCoords.bl.x, oCoords.bl.y); return tl.x > selectionTL.x && tr.x < selectionBR.x @@ -8810,7 +8843,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { // canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); xpoints = this._findCrossPoints(ex, ey, lines); - if (xpoints % 2 == 1 && xpoints != 0) { + if (xpoints % 2 === 1 && xpoints !== 0) { this.__corner = i; return i; } @@ -8843,7 +8876,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { continue; } // optimisation 3: vertical line case - if ((iLine.o.x == iLine.d.x) && (iLine.o.x >= ex)) { + if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= ex)) { xi = iLine.o.x; yi = ey; } @@ -8862,7 +8895,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { xcount += 1; } // optimisation 4: specific for square images - if (xcount == 2) { + if (xcount === 2) { break; } } @@ -8875,7 +8908,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { * @private * @param oCoords {Object} coordinates of the image corners */ - _getImageLines: function(oCoords, i) { + _getImageLines: function(oCoords) { return { topline: { o: oCoords.tl, @@ -8893,7 +8926,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { o: oCoords.bl, d: oCoords.tl } - } + }; }, /** @@ -9136,7 +9169,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { * */ animate: function() { - if (arguments[0] && typeof arguments[0] == 'object') { + if (arguments[0] && typeof arguments[0] === 'object') { for (var prop in arguments[0]) { this._animate(prop, arguments[0][prop], arguments[1]); } @@ -9160,7 +9193,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { options.from = this.get(property); } - if (/[+-]/.test((to + '').charAt(0))) { + if (/[+\-]/.test((to + '').charAt(0))) { to = this.get(property) + parseFloat(to); } @@ -9313,7 +9346,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { }); -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { @@ -9321,7 +9354,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, - parentSet = fabric.Object.prototype.set, coordProps = { 'x1': 1, 'x2': 1, 'y1': 1, 'y2': 1 }; if (fabric.Line) { @@ -9498,7 +9530,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.Line(points, object); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { "use strict"; @@ -9642,7 +9674,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { options || (options = { }); var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES); if (!isValidRadius(parsedAttributes)) { - throw Error('value of `r` attribute is required and can not be negative'); + throw new Error('value of `r` attribute is required and can not be negative'); } if ('left' in parsedAttributes) { parsedAttributes.left -= (options.width / 2) || 0; @@ -9671,30 +9703,30 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.Circle(object); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { - + "use strict"; - + var fabric = global.fabric || (global.fabric = { }); - + if (fabric.Triangle) { fabric.warn('fabric.Triangle is already defined'); return; } - - /** + + /** * @class Triangle * @extends fabric.Object */ fabric.Triangle = fabric.util.createClass(fabric.Object, /** @scope fabric.Triangle.prototype */ { - + /** * @property * @type String */ type: 'triangle', - + /** * Constructor * @method initialize @@ -9703,28 +9735,28 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { */ initialize: function(options) { options = options || { }; - + this.callSuper('initialize', options); - + this.set('width', options.width || 100) .set('height', options.height || 100); }, - + /** * @private * @method _render * @param ctx {CanvasRenderingContext2D} Context to render on */ - _render: function(ctx) { + _render: function(ctx) { var widthBy2 = this.width / 2, heightBy2 = this.height / 2; - + ctx.beginPath(); ctx.moveTo(-widthBy2, heightBy2); ctx.lineTo(0, -heightBy2); ctx.lineTo(widthBy2, heightBy2); ctx.closePath(); - + if (this.fill) { ctx.fill(); } @@ -9732,7 +9764,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { ctx.stroke(); } }, - + /** * Returns complexity of an instance * @method complexity @@ -9741,7 +9773,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { complexity: function() { return 1; }, - + /** * Returns svg representation of an instance * @method toSVG @@ -9765,7 +9797,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { '/>'; } }); - + /** * Returns fabric.Triangle instance from an object representation * @static @@ -9777,7 +9809,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.Triangle(object); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global){ "use strict"; @@ -9942,7 +9974,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.Ellipse(object); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { "use strict"; @@ -10162,7 +10194,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.Rect(object); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { "use strict"; @@ -10314,7 +10346,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.Polyline(points, object); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { "use strict"; @@ -10330,9 +10362,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return; } - function byX(p) { return p.x; } - function byY(p) { return p.y; } - /** * @class Polygon * @extends fabric.Object @@ -10485,7 +10514,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.Polygon(object.points, object); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { var commandLengths = { @@ -10554,7 +10583,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var sfactor_sq = 1 / d - 0.25; if (sfactor_sq < 0) sfactor_sq = 0; var sfactor = Math.sqrt(sfactor_sq); - if (sweep == large) sfactor = -sfactor; + if (sweep === large) sfactor = -sfactor; var xc = 0.5 * (x0 + x1) - sfactor * (y1-y0); var yc = 0.5 * (y0 + y1) + sfactor * (x1-x0); @@ -10562,9 +10591,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var th1 = Math.atan2(y1-yc, x1-xc); var th_arc = th1-th0; - if (th_arc < 0 && sweep == 1){ + if (th_arc < 0 && sweep === 1){ th_arc += 2*Math.PI; - } else if (th_arc > 0 && sweep == 0) { + } else if (th_arc > 0 && sweep === 0) { th_arc -= 2 * Math.PI; } @@ -10667,7 +10696,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { this.setOptions(options); if (!path) { - throw Error('`path` argument is required'); + throw new Error('`path` argument is required'); } var fromArray = _toString.call(path) === '[object Array]'; @@ -11119,7 +11148,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { chunks, parsed; - for (var i = 0, j, chunksParsed, len = this.path.length; i < len; i++) { + for (var i = 0, chunksParsed, len = this.path.length; i < len; i++) { currentPath = this.path[i]; chunks = currentPath.slice(1).trim().replace(/(\d)-/g, '$1###-').split(/\s|,|###/); chunksParsed = [ currentPath.charAt(0) ]; @@ -11247,7 +11276,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { "use strict"; @@ -11255,7 +11284,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, invoke = fabric.util.array.invoke, - parentSet = fabric.Object.prototype.set, parentToObject = fabric.Object.prototype.toObject, camelize = fabric.util.string.camelize, capitalize = fabric.util.string.capitalize; @@ -11487,7 +11515,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { return new fabric.PathGroup(paths, object); }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global){ "use strict"; @@ -11698,8 +11726,11 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var groupScaleFactor = Math.max(this.scaleX, this.scaleY); - for (var i = 0, len = this.objects.length, object; object = this.objects[i]; i++) { + for (var i = 0, len = this.objects.length; i < len; i++) { + + var object = this.objects[i]; var originalScaleFactor = object.borderScaleFactor; + object.borderScaleFactor = groupScaleFactor; object.render(ctx); object.borderScaleFactor = originalScaleFactor; @@ -11729,7 +11760,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { */ complexity: function() { return this.getObjects().reduce(function(total, object) { - total += (typeof object.complexity == 'function') ? object.complexity() : 0; + total += (typeof object.complexity === 'function') ? object.complexity() : 0; return total; }, 0); }, @@ -11758,8 +11789,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var groupLeft = this.get('left'), groupTop = this.get('top'), groupAngle = this.getAngle() * (Math.PI / 180), - objectLeft = object.get('originalLeft'), - objectTop = object.get('originalTop'), rotatedTop = Math.cos(groupAngle) * object.get('top') + Math.sin(groupAngle) * object.get('left'), rotatedLeft = -Math.sin(groupAngle) * object.get('top') + Math.cos(groupAngle) * object.get('left'); @@ -11889,7 +11918,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { aX.push(o.oCoords[prop].x); aY.push(o.oCoords[prop].y); } - }; + } minX = min(aX); maxX = max(aX); @@ -11971,7 +12000,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { fabric.Group.async = true; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function(global) { "use strict"; @@ -11985,7 +12014,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { if (global.fabric.Image) { fabric.warn('fabric.Image is already defined.'); return; - }; + } if (!fabric.Object) { fabric.warn('fabric.Object is required for fabric.Image initialization'); @@ -12083,9 +12112,9 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { * @method setBorderVisibility * @param {Boolean} visible When true, border is set to be visible */ - setBorderVisibility: function(visible) { + setBorderVisibility: function() { this._resetWidthHeight(); - this._adjustWidthHeightToBorders(showBorder); + this._adjustWidthHeightToBorders(); this.setCoords(); }, @@ -12197,10 +12226,10 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { var isLikelyNode = typeof Buffer !== 'undefined' && typeof window === 'undefined', imgEl = this._originalImage, canvasEl = fabric.document.createElement('canvas'), - replacement = isLikelyNode ? new (require('canvas').Image) : fabric.document.createElement('img'), + replacement = isLikelyNode ? new (require('canvas').Image)() : fabric.document.createElement('img'), _this = this; - if (!canvasEl.getContext && typeof G_vmlCanvasManager != 'undefined') { + if (!canvasEl.getContext && typeof G_vmlCanvasManager !== 'undefined') { G_vmlCanvasManager.initElement(canvasEl); } @@ -12430,7 +12459,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { fabric.Image.async = true; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); fabric.util.object.extend(fabric.Object.prototype, { @@ -12992,29 +13021,29 @@ fabric.Image.filters.Tint = fabric.util.createClass( /** @scope fabric.Image.fil * @param {Object} canvasEl Canvas element to apply filter to */ applyTo: function(canvasEl) { - + var context = canvasEl.getContext('2d'), imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), data = imageData.data, - iLen = data.length, i, - r, g, b, a; - - var rgb = parseInt(this.color).toString(16); - var cr = parseInt('0x'+rgb.substr(0, 2)); - var cg = parseInt('0x'+rgb.substr(2, 2)); - var cb = parseInt('0x'+rgb.substr(4, 2)); - + iLen = data.length, i, a; + + var rgb = parseInt(this.color, 10).toString(16); + + var cr = parseInt('0x' + rgb.substr(0, 2), 16); + var cg = parseInt('0x' + rgb.substr(2, 2), 16); + var cb = parseInt('0x' + rgb.substr(4, 2), 16); + for (i = 0; i < iLen; i+=4) { a = data[i+3]; - - if (a > 0){ + + if (a > 0){ data[i] = cr; data[i+1] = cg; - data[i+2] = cb; - } + data[i+2] = cb; + } } - + context.putImageData(imageData, 0, 0); }, @@ -13168,7 +13197,7 @@ fabric.Image.filters.Tint.fromObject = function(object) { _initDimensions: function() { var canvasEl = fabric.document.createElement('canvas'); - if (!canvasEl.getContext && typeof G_vmlCanvasManager != 'undefined') { + if (!canvasEl.getContext && typeof G_vmlCanvasManager !== 'undefined') { G_vmlCanvasManager.initElement(canvasEl); } @@ -13480,29 +13509,30 @@ fabric.Image.filters.Tint.fromObject = function(object) { _renderTextDecoration: function(ctx, textLines) { var halfOfVerticalBox = this._getTextHeight(ctx, textLines) / 2; + var _this = this; function renderLinesAtOffset(offset) { for (var i = 0, len = textLines.length; i < len; i++) { var lineWidth = ctx.measureText(textLines[i]).width; - var lineLeftOffset = this._getLineLeftOffset(lineWidth); + var lineLeftOffset = _this._getLineLeftOffset(lineWidth); ctx.fillRect( - (-this.width / 2) + lineLeftOffset, - (offset + (i * this.fontSize * this.lineHeight)) - halfOfVerticalBox, + (-_this.width / 2) + lineLeftOffset, + (offset + (i * _this.fontSize * _this.lineHeight)) - halfOfVerticalBox, lineWidth, 1); } } if (this.textDecoration.indexOf('underline') > -1) { - renderLinesAtOffset.call(this, this.fontSize); + renderLinesAtOffset(this.fontSize); } if (this.textDecoration.indexOf('line-through') > -1) { - renderLinesAtOffset.call(this, this.fontSize / 2); + renderLinesAtOffset(this.fontSize / 2); } if (this.textDecoration.indexOf('overline') > -1) { - renderLinesAtOffset.call(this, 0); + renderLinesAtOffset(0); } }, @@ -13530,7 +13560,7 @@ fabric.Image.filters.Tint.fromObject = function(object) { // Cufon doesn't play nice with textDecoration=underline if element doesn't have a parent container.appendChild(el); - if (typeof G_vmlCanvasManager == 'undefined') { + if (typeof G_vmlCanvasManager === 'undefined') { el.innerHTML = this.text; } else { @@ -13814,16 +13844,16 @@ fabric.Image.filters.Tint.fromObject = function(object) { } var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES); - var options = fabric.util.object.extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes); + options = fabric.util.object.extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes); var text = new fabric.Text(element.textContent, options); return text; }; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); (function() { - if (typeof document != 'undefined' && typeof window != 'undefined') { + if (typeof document !== 'undefined' && typeof window !== 'undefined') { return; } @@ -13837,7 +13867,7 @@ fabric.Image.filters.Tint.fromObject = function(object) { function request(url, encoding, callback) { var oURL = URL.parse(url), client = HTTP.createClient(oURL.port, oURL.hostname), - request = client.request('GET', oURL.pathname, { 'host': oURL.hostname }); + req = client.request('GET', oURL.pathname, { 'host': oURL.hostname }); client.addListener('error', function(err) { if (err.errno === process.ECONNREFUSED) { @@ -13848,8 +13878,8 @@ fabric.Image.filters.Tint.fromObject = function(object) { } }); - request.end(); - request.on('response', function (response) { + req.end(); + req.on('response', function (response) { var body = ""; if (encoding) { response.setEncoding(encoding); @@ -13858,7 +13888,7 @@ fabric.Image.filters.Tint.fromObject = function(object) { callback(body); }); response.on('data', function (chunk) { - if (response.statusCode == 200) { + if (response.statusCode === 200) { body += chunk; } }); @@ -13924,8 +13954,8 @@ fabric.Image.filters.Tint.fromObject = function(object) { canvasEl.width = nodeCanvas.width; canvasEl.height = nodeCanvas.height; - var canvas = fabric.Canvas || fabric.StaticCanvas; - var fabricCanvas = new canvas(canvasEl); + var FabricCanvas = fabric.Canvas || fabric.StaticCanvas; + var fabricCanvas = new FabricCanvas(canvasEl); fabricCanvas.contextContainer = nodeCanvas.getContext('2d'); fabricCanvas.nodeCanvas = nodeCanvas; @@ -13935,9 +13965,6 @@ fabric.Image.filters.Tint.fromObject = function(object) { fabric.StaticCanvas.prototype.createPNGStream = function() { return this.nodeCanvas.createPNGStream(); }; - if (fabric.Canvas) { - fabric.Canvas.prototype.createPNGStream - } var origSetWidth = fabric.StaticCanvas.prototype.setWidth; fabric.StaticCanvas.prototype.setWidth = function(width) { diff --git a/dist/all.min.js b/dist/all.min.js index 0cbf1fca..f63be99f 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,7 +1,7 @@ /* Fabric.js Copyright 2008-2012, Printio (Juriy Zaytsev, Maxim Chernyak) */ -var fabric=fabric||{version:"0.9.13"};if(typeof exports!="undefined"){exports.fabric=fabric}if(typeof document!="undefined"&&typeof window!="undefined"){fabric.document=document;fabric.window=window}else{fabric.document=require("jsdom").jsdom("");fabric.window=fabric.document.createWindow()}fabric.isTouchSupported="ontouchstart" in fabric.document.documentElement;fabric.isLikelyNode=typeof Buffer!=="undefined"&&typeof window==="undefined"; +var fabric=fabric||{version:"0.9.14"};if(typeof exports!="undefined"){exports.fabric=fabric}if(typeof document!="undefined"&&typeof window!="undefined"){fabric.document=document;fabric.window=window}else{fabric.document=require("jsdom").jsdom("");fabric.window=fabric.document.createWindow()}fabric.isTouchSupported="ontouchstart" in fabric.document.documentElement;fabric.isLikelyNode=typeof Buffer!=="undefined"&&typeof window==="undefined"; /* * Copyright (c) 2009 Simo Kinnunen. * Licensed under the MIT license. */ -var Cufon=(function(){var k=function(){return k.replace.apply(null,arguments)};var u=k.DOM={ready:(function(){var z=false,B={loaded:1,complete:1};var y=[],A=function(){if(z){return}z=true;for(var C;C=y.shift();C()){}};if(fabric.document.addEventListener){fabric.document.addEventListener("DOMContentLoaded",A,false);fabric.window.addEventListener("pageshow",A,false)}if(!fabric.window.opera&&fabric.document.readyState){(function(){B[fabric.document.readyState]?A():setTimeout(arguments.callee,10)})()}if(fabric.document.readyState&&fabric.document.createStyleSheet){(function(){try{fabric.document.body.doScroll("left");A()}catch(C){setTimeout(arguments.callee,1)}})()}o(fabric.window,"load",A);return function(C){if(!arguments.length){A()}else{z?C():y.push(C)}}})()};var l=k.CSS={Size:function(z,y){this.value=parseFloat(z);this.unit=String(z).match(/[a-z%]*$/)[0]||"px";this.convert=function(A){return A/y*this.value};this.convertFrom=function(A){return A/this.value*y};this.toString=function(){return this.value+this.unit}},getStyle:function(y){return new a(y.style)},quotedList:i(function(B){var A=[],z=/\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g,y;while(y=z.exec(B)){A.push(y[3]||y[1])}return A}),ready:(function(){var A=false;var z=[],B=function(){A=true;for(var D;D=z.shift();D()){}};var y=Object.prototype.propertyIsEnumerable?f("style"):{length:0};var C=f("link");u.ready(function(){var G=0,F;for(var E=0,D=C.length;F=C[E],E=y.length+G){B()}else{setTimeout(arguments.callee,10)}});return function(D){if(A){D()}else{z.push(D)}}})(),supports:function(A,z){var y=fabric.document.createElement("span").style;if(y[A]===undefined){return false}y[A]=z;return y[A]===z},textAlign:function(B,A,y,z){if(A.get("textAlign")=="right"){if(y>0){B=" "+B}}else{if(y400}if(F==500){F=400}for(var G in D){G=parseInt(G,10);if(!C||GA){A=G}H.push(G)}if(FA){F=A}H.sort(function(J,I){return(B?(J>F&&I>F)?JI:(JI:Jz){z=e}L.push(e);e=0;continue}var B=ab.glyphs[ag[aa]]||ab.missingGlyph;if(!B){continue}e+=D=Number(B.w||ab.w)+U}L.push(e);e=Math.max(z,e);var m=[];for(var aa=L.length;aa--;){m[aa]=e-L[aa]}if(D===null){return null}V+=(H.width-D);C+=H.minX;var v,p;if(n){v=J;p=J.firstChild}else{v=fabric.document.createElement("span");v.className="cufon cufon-canvas";v.alt=E;p=fabric.document.createElement("canvas");v.appendChild(p);if(A.printable){var Y=fabric.document.createElement("span");Y.className="cufon-alt";Y.appendChild(fabric.document.createTextNode(E));v.appendChild(Y)}}var ah=v.style;var O=p.style||{};var k=o.convert(H.height-I+T);var af=Math.ceil(k);var S=af/k;p.width=Math.ceil(o.convert(e+V-C)*S);p.height=af;I+=H.minY;O.top=Math.round(o.convert(I-ab.ascent))+"px";O.left=Math.round(o.convert(C))+"px";var j=Math.ceil(o.convert(e*S));var t=j+"px";var s=o.convert(ab.height);var F=(A.lineHeight-1)*o.convert(-ab.ascent/5)*(M-1);Cufon.textOptions.width=j;Cufon.textOptions.height=(s*M)+F;Cufon.textOptions.lines=M;Cufon.textOptions.totalLineHeight=F;if(a){ah.width=t;ah.height=s+"px"}else{ah.paddingLeft=t;ah.paddingBottom=(s-1)+"px"}var ad=Cufon.textOptions.context||p.getContext("2d"),K=af/H.height;Cufon.textOptions.fontAscent=ab.ascent*K;Cufon.textOptions.boundaries=null;for(var w=Cufon.textOptions.shadowOffsets,aa=R.length;aa--;){w[aa]=[R[aa][0]*K,R[aa][1]*K]}ad.save();ad.scale(K,K);ad.translate(-C-((1/K*p.width)/2)+(Cufon.fonts[ab.family].offsetLeft||0),-I-((Cufon.textOptions.height/K)/2)+(Cufon.fonts[ab.family].offsetTop||0));ad.lineWidth=ab.face["underline-thickness"];ad.save();function q(l,i){ad.strokeStyle=i;ad.beginPath();ad.moveTo(0,l);ad.lineTo(e,l);ad.stroke()}var r=Cufon.getTextDecoration(A),u=A.fontStyle==="italic";function ae(){ad.save();ad.fillStyle=A.backgroundColor;var aj=0,an=0,y=[{left:0}];if(A.textAlign==="right"){ad.translate(m[an],0);y[0].left=m[an]*K}else{if(A.textAlign==="center"){ad.translate(m[an]/2,0);y[0].left=m[an]/2*K}}for(var al=0,ak=ag.length;al.cufon-vml-canvas{text-indent:0}@media screen{cvml\\:shape,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute}.cufon-vml-canvas{position:absolute;text-align:left}.cufon-vml{display:inline-block;position:relative;vertical-align:middle}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none}.cufon-vml .cufon-alt{display:inline}}');function c(e,f){return a(e,/(?:em|ex|%)$/i.test(f)?"1em":f)}function a(h,i){if(/px$/i.test(i)){return parseFloat(i)}var g=h.style.left,f=h.runtimeStyle.left;h.runtimeStyle.left=h.currentStyle.left;h.style.left=i;var e=h.style.pixelLeft;h.style.left=g;h.runtimeStyle.left=f;return e}return function(T,z,O,w,D,U,M){var h=(z===null);if(h){z=D.alt}var B=T.viewBox;var j=O.computedFontSize||(O.computedFontSize=new Cufon.CSS.Size(c(U,O.get("fontSize"))+"px",T.baseSize));var L=O.computedLSpacing;if(L==undefined){L=O.get("letterSpacing");O.computedLSpacing=L=(L=="normal")?0:~~j.convertFrom(a(U,L))}var t,m;if(h){t=D;m=D.firstChild}else{t=fabric.document.createElement("span");t.className="cufon cufon-vml";t.alt=z;m=fabric.document.createElement("span");m.className="cufon-vml-canvas";t.appendChild(m);if(w.printable){var R=fabric.document.createElement("span");R.className="cufon-alt";R.appendChild(fabric.document.createTextNode(z));t.appendChild(R)}if(!M){t.appendChild(fabric.document.createElement("cvml:shape"))}}var Z=t.style;var G=m.style;var f=j.convert(B.height),W=Math.ceil(f);var K=W/f;var J=B.minX,I=B.minY;G.height=W;G.top=Math.round(j.convert(I-T.ascent));G.left=Math.round(j.convert(J));Z.height=j.convert(T.height)+"px";var p=Cufon.getTextDecoration(w);var y=O.get("color");var X=Cufon.CSS.textTransform(z,O).split("");var e=0,H=0,q=null;var x,r,A=w.textShadow;for(var S=0,Q=0,P=X.length;Sw?p:(o-n);s(t(currentTime,m,byValue,p));if(o>w||q()){x.onComplete&&x.onComplete();return}k(r)})()}var f=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(n,m){fabric.window.setTimeout(n,1000/60)};var k=function(){return f.apply(fabric.window,arguments)};function b(n,p,o){if(n){var m=new Image();m.onload=function(){p&&p.call(o,m);m=m.onload=null};m.src=n}else{p&&p.call(o,n)}}function i(p,s){function o(t){return fabric[fabric.util.string.camelize(fabric.util.string.capitalize(t))]}function n(){if(++r===m){if(s){s(q)}}}var q=[],r=0,m=p.length;p.forEach(function(v,u){if(!v.type){return}var t=o(v.type);if(t.async){t.fromObject(v,function(w){q[u]=w;n()})}else{q[u]=t.fromObject(v);n()}})}function a(o,n,p){var m=o.length>1?new fabric.PathGroup(o,n):o[0];if(typeof p!=="undefined"){m.setSourcePath(p)}return m}fabric.util.removeFromArray=j;fabric.util.degreesToRadians=c;fabric.util.toFixed=e;fabric.util.getRandomInt=g;fabric.util.falseFunction=l;fabric.util.animate=d;fabric.util.requestAnimFrame=k;fabric.util.loadImage=b;fabric.util.enlivenObjects=i;fabric.util.groupSVGElements=a})();(function(){var d=Array.prototype.slice;if(!Array.prototype.indexOf){Array.prototype.indexOf=function(g){if(this===void 0||this===null){throw new TypeError()}var h=Object(this),e=h.length>>>0;if(e===0){return -1}var i=0;if(arguments.length>0){i=Number(arguments[1]);if(i!==i){i=0}else{if(i!==0&&i!==(1/0)&&i!==-(1/0)){i=(i>0||-1)*Math.floor(Math.abs(i))}}}if(i>=e){return -1}var f=i>=0?i:Math.max(e-Math.abs(i),0);for(;f>>0;f>>0;g>>0;f>>0;f>>0;g>>0,f=0,h;if(arguments.length>1){h=arguments[1]}else{do{if(f in this){h=this[f++];break}if(++f>=e){throw new TypeError()}}while(true)}for(;f=e){e=h[f][g]}}}else{while(f--){if(h[f]>=e){e=h[f]}}}return e}function c(h,g){if(!h||h.length===0){return undefined}var f=h.length-1,e=g?h[f][g]:h[f];if(g){while(f--){if(h[f][g]/g,">")}fabric.util.string={camelize:b,capitalize:c,escapeXml:a}}());(function(){var c=Array.prototype.slice,a=Function.prototype.apply,b=function(){};if(!Function.prototype.bind){Function.prototype.bind=function(d){var g=this,e=c.call(arguments,1),f;if(e.length){f=function(){return a.call(g,this instanceof b?this:d,e.concat(c.call(arguments)))}}else{f=function(){return a.call(g,this instanceof b?this:d,arguments)}}b.prototype=this.prototype;f.prototype=new b;return f}}})();(function(){var f=Array.prototype.slice,e=function(){};var c=(function(){for(var g in {toString:1}){if(g==="toString"){return false}}return true})();var b=function(g,j,h){for(var i in j){if(i in g.prototype&&typeof g.prototype[i]=="function"){g.prototype[i]=(function(k){return function(){var m=this.constructor.superclass;this.constructor.superclass=h;var l=j[k].apply(this,arguments);this.constructor.superclass=m;if(k!=="initialize"){return l}}})(i)}else{g.prototype[i]=j[i]}if(c){if(j.toString!==Object.prototype.toString){g.prototype.toString=j.toString}if(j.valueOf!==Object.prototype.valueOf){g.prototype.valueOf=j.valueOf}}}};function a(){}function d(){var k=null,j=f.call(arguments,0);if(typeof j[0]==="function"){k=j.shift()}function g(){this.initialize.apply(this,arguments)}g.superclass=k;g.subclasses=[];if(k){a.prototype=k.prototype;g.prototype=new a;k.subclasses.push(g)}for(var h=0,l=j.length;h-1?c(j,l.match(/opacity:\s*(\d?\.?\d*)/)[1]):j}for(var m in l){if(m==="opacity"){c(j,l[m])}else{var k=(m==="float"||m==="cssFloat")?(typeof n.styleFloat==="undefined"?"cssFloat":"styleFloat"):m;n[k]=l[m]}}return j}var h=fabric.document.createElement("div"),g=typeof h.style.opacity==="string",b=typeof h.style.filter==="string",a=fabric.document.defaultView,f=a&&typeof a.getComputedStyle!=="undefined",d=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,c=function(i){return i};if(g){c=function(i,j){i.style.opacity=j;return i}}else{if(b){c=function(i,j){var k=i.style;if(i.currentStyle&&!i.currentStyle.hasLayout){k.zoom=1}if(d.test(k.filter)){j=j>=0.9999?"":("alpha(opacity="+(j*100)+")");k.filter=k.filter.replace(d,j)}else{k.filter+=" alpha(opacity="+(j*100)+")"}return i}}}fabric.util.setStyle=e})();(function(){var h=Array.prototype.slice;function g(j){return typeof j==="string"?fabric.document.getElementById(j):j}function b(j){return h.call(j,0)}try{var i=b(fabric.document.childNodes) instanceof Array}catch(a){}if(!i){b=function(k){var j=new Array(k.length),l=k.length;while(l--){j[l]=k[l]}return j}}function c(k,j){var l=fabric.document.createElement(k);for(var m in j){if(m==="class"){l.className=j[m]}else{if(m==="for"){l.htmlFor=j[m]}else{l.setAttribute(m,j[m])}}}return l}function f(j,k){if((" "+j.className+" ").indexOf(" "+k+" ")===-1){j.className+=(j.className?" ":"")+k}}function e(k,l,j){if(typeof l==="string"){l=c(l,j)}if(k.parentNode){k.parentNode.replaceChild(l,k)}l.appendChild(k);return l}function d(k){var j=0,l=0;do{j+=k.offsetTop||0;l+=k.offsetLeft||0;k=k.offsetParent}while(k);return({left:l,top:j})}(function(){var k=fabric.document.documentElement.style;var l="userSelect" in k?"userSelect":"MozUserSelect" in k?"MozUserSelect":"WebkitUserSelect" in k?"WebkitUserSelect":"KhtmlUserSelect" in k?"KhtmlUserSelect":"";function m(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=fabric.util.falseFunction}if(l){n.style[l]="none"}else{if(typeof n.unselectable=="string"){n.unselectable="on"}}return n}function j(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=null}if(l){n.style[l]=""}else{if(typeof n.unselectable=="string"){n.unselectable=""}}return n}fabric.util.makeElementUnselectable=m;fabric.util.makeElementSelectable=j})();(function(){function j(k,o){var m=fabric.document.getElementsByTagName("head")[0],l=fabric.document.createElement("script"),n=true;l.type="text/javascript";l.setAttribute("runat","server");l.onload=l.onreadystatechange=function(p){if(n){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete"){return}n=false;o(p||fabric.window.event);l=l.onload=l.onreadystatechange=null}};l.src=k;m.appendChild(l)}fabric.util.getScript=j})();fabric.util.getById=g;fabric.util.toArray=b;fabric.util.makeElement=c;fabric.util.addClass=f;fabric.util.wrapElement=e;fabric.util.getElementOffset=d})();(function(){function d(e,f){return e+(/\?/.test(e)?"&":"?")+f}var c=(function(){var h=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest()}];for(var e=h.length;e--;){try{var g=h[e]();if(g){return h[e]}}catch(f){}}})();function a(){}function b(g,f){f||(f={});var j=f.method?f.method.toUpperCase():"GET",i=f.onComplete||function(){},h=c(),e;h.onreadystatechange=function(){if(h.readyState===4){i(h);h.onreadystatechange=a}};if(j==="GET"){e=null;if(typeof f.parameters=="string"){g=d(g,f.parameters)}}h.open(j,g,true);if(j==="POST"||j==="PUT"){h.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}h.send(e);return h}fabric.util.request=b})();(function(){function d(F,E,H,G){return H*(F/=G)*F+E}function l(F,E,H,G){return -H*(F/=G)*(F-2)+E}function r(F,E,H,G){if((F/=G/2)<1){return H/2*F*F+E}return -H/2*((--F)*(F-2)-1)+E}function B(F,E,H,G){return H*(F/=G)*F*F+E}function q(F,E,H,G){return H*((F=F/G-1)*F*F+1)+E}function u(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F+E}return H/2*((F-=2)*F*F+2)+E}function t(F,E,H,G){return H*(F/=G)*F*F*F+E}function g(F,E,H,G){return -H*((F=F/G-1)*F*F*F-1)+E}function k(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F*F+E}return -H/2*((F-=2)*F*F*F-2)+E}function y(F,E,H,G){return H*(F/=G)*F*F*F*F+E}function j(F,E,H,G){return H*((F=F/G-1)*F*F*F*F+1)+E}function n(F,E,H,G){if((F/=G/2)<1){return H/2*F*F*F*F*F+E}return H/2*((F-=2)*F*F*F*F+2)+E}function f(F,E,H,G){return -H*Math.cos(F/G*(Math.PI/2))+H+E}function o(F,E,H,G){return H*Math.sin(F/G*(Math.PI/2))+E}function v(F,E,H,G){return -H/2*(Math.cos(Math.PI*F/G)-1)+E}function D(F,E,H,G){return(F==0)?E:H*Math.pow(2,10*(F/G-1))+E}function c(F,E,H,G){return(F==G)?E+H:H*(-Math.pow(2,-10*F/G)+1)+E}function i(F,E,H,G){if(F==0){return E}if(F==G){return E+H}if((F/=G/2)<1){return H/2*Math.pow(2,10*(F-1))+E}return H/2*(-Math.pow(2,-10*--F)+2)+E}function h(F,E,H,G){return -H*(Math.sqrt(1-(F/=G)*F)-1)+E}function p(F,E,H,G){return H*Math.sqrt(1-(F=F/G-1)*F)+E}function x(F,E,H,G){if((F/=G/2)<1){return -H/2*(Math.sqrt(1-F*F)-1)+E}return H/2*(Math.sqrt(1-(F-=2)*F)+1)+E}function s(G,E,K,J){var H=1.70158;var I=0;var F=K;if(G==0){return E}if((G/=J)==1){return E+K}if(!I){I=J*0.3}if(F-1;w=w.split(/\s+/);var u=[];if(y){for(var v=0,t=w.length;v/i,""))}if(!x.documentElement){return}h.parseSVGDocument(x.documentElement,function(A,z){k.set(u,{objects:h.util.array.invoke(A,"toObject"),options:z});w(A,z)},t)}}function b(v){var u=v.objects,t=v.options;u=u.map(function(w){return h[f(w.type)].fromObject(w)});return({objects:u,options:t})}function n(u,x,t){u=u.trim();var v;if(typeof DOMParser!=="undefined"){var w=new DOMParser();if(w&&w.parseFromString){v=w.parseFromString(u,"text/xml")}}else{if(h.window.ActiveXObject){var v=new ActiveXObject("Microsoft.XMLDOM");v.async="false";v.loadXML(u.replace(//i,""))}}h.parseSVGDocument(v.documentElement,function(z,y){x(z,y)},t)}function m(w){var u="";for(var v=0,t=w.length;v",'",""].join("")}return u}p(h,{parseAttributes:e,parseElements:g,parseStyleAttribute:i,parsePointsAttribute:s,getCSSRules:d,loadSVGFromURL:c,loadSVGFromString:n,createSVGFontFacesMarkup:m})})(typeof exports!="undefined"?exports:this);(function(){function c(h){var g=h.getAttribute("style");if(g){var k=g.split(/\s*;\s*/);if(k[k.length-1]===""){k.pop()}for(var f=k.length;f--;){var e=k[f].split(/\s*:\s*/),d=e[0].trim(),j=e[1].trim();if(d==="stop-color"){return j}}}}fabric.Gradient=fabric.util.createClass({initialize:function(d){d||(d={});this.x1=d.x1||0;this.y1=d.y1||0;this.x2=d.x2||0;this.y2=d.y2||0;this.colorStops=d.colorStops},toObject:function(){return{x1:this.x1,x2:this.x2,y1:this.y1,y2:this.y2,colorStops:this.colorStops}},toLiveGradient:function(e){var g=e.createLinearGradient(this.x1,this.y1,this.x2||e.canvas.width,this.y2);for(var d in this.colorStops){var f=this.colorStops[d];g.addColorStop(parseFloat(d),f)}return g}});fabric.util.object.extend(fabric.Gradient,{fromElement:function(h,e){var l=h.getElementsByTagName("stop"),h,k,f={},d,j={x1:h.getAttribute("x1")||0,y1:h.getAttribute("y1")||0,x2:h.getAttribute("x2")||"100%",y2:h.getAttribute("y2")||0};for(var g=l.length;g--;){h=l[g];k=h.getAttribute("offset");k=parseFloat(k)/(/%$/.test(k)?100:1);f[k]=c(h)||h.getAttribute("stop-color")}a(e,j);return new fabric.Gradient({x1:j.x1,y1:j.y1,x2:j.x2,y2:j.y2,colorStops:f})},forObject:function(e,d){d||(d={});a(e,d);return new fabric.Gradient(d)}});function a(f,e){for(var g in e){if(typeof e[g]==="string"&&/^\d+%$/.test(e[g])){var d=parseFloat(e[g],10);if(g==="x1"||g==="x2"){e[g]=f.width*d/100}else{if(g==="y1"||g==="y2"){e[g]=f.height*d/100}}}if(g==="x1"||g==="x2"){e[g]-=f.width/2}else{if(g==="y1"||g==="y2"){e[g]-=f.height/2}}}}function b(j){var f=j.getElementsByTagName("linearGradient"),d=j.getElementsByTagName("radialGradient"),g,h={};for(var e=f.length;e--;){g=f[e];h[g.getAttribute("id")]=g}for(var e=d.length;e--;){g=d[e];h[g.getAttribute("id")]=g}return h}fabric.getGradientDefs=b})();(function(b){var c=b.fabric||(b.fabric={});if(c.Point){c.warn("fabric.Point is already defined");return}c.Point=a;function a(d,e){if(arguments.length>0){this.init(d,e)}}a.prototype={constructor:a,init:function(d,e){this.x=d;this.y=e},add:function(d){return new a(this.x+d.x,this.y+d.y)},addEquals:function(d){this.x+=d.x;this.y+=d.y;return this},scalarAdd:function(d){return new a(this.x+d,this.y+d)},scalarAddEquals:function(d){this.x+=d;this.y+=d;return this},subtract:function(d){return new a(this.x-d.x,this.y-d.y)},subtractEquals:function(d){this.x-=d.x;this.y-=d.y;return this},scalarSubtract:function(d){return new a(this.x-d,this.y-d)},scalarSubtractEquals:function(d){this.x-=d;this.y-=d;return this},multiply:function(d){return new a(this.x*d,this.y*d)},multiplyEquals:function(d){this.x*=d;this.y*=d;return this},divide:function(d){return new a(this.x/d,this.y/d)},divideEquals:function(d){this.x/=d;this.y/=d;return this},eq:function(d){return(this.x==d.x&&this.y==d.y)},lt:function(d){return(this.xd.x&&this.y>d.y)},gte:function(d){return(this.x>=d.x&&this.y>=d.y)},lerp:function(e,d){return new a(this.x+(e.x-this.x)*d,this.y+(e.y-this.y)*d)},distanceFrom:function(f){var e=this.x-f.x,d=this.y-f.y;return Math.sqrt(e*e+d*d)},min:function(d){return new a(Math.min(this.x,d.x),Math.min(this.y,d.y))},max:function(d){return new a(Math.max(this.x,d.x),Math.max(this.y,d.y))},toString:function(){return this.x+","+this.y},setXY:function(d,e){this.x=d;this.y=e},setFromPoint:function(d){this.x=d.x;this.y=d.y},swap:function(e){var d=this.x,f=this.y;this.x=e.x;this.y=e.y;e.x=d;e.y=f}}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Intersection){b.warn("fabric.Intersection is already defined");return}function c(d){if(arguments.length>0){this.init(d)}}b.Intersection=c;b.Intersection.prototype={init:function(d){this.status=d;this.points=[]},appendPoint:function(d){this.points.push(d)},appendPoints:function(d){this.points=this.points.concat(d)}};b.Intersection.intersectLineLine=function(h,f,l,k){var m,i=(k.x-l.x)*(h.y-l.y)-(k.y-l.y)*(h.x-l.x),j=(f.x-h.x)*(h.y-l.y)-(f.y-h.y)*(h.x-l.x),g=(k.y-l.y)*(f.x-h.x)-(k.x-l.x)*(f.y-h.y);if(g!=0){var e=i/g,d=j/g;if(0<=e&&e<=1&&0<=d&&d<=1){m=new c("Intersection");m.points.push(new b.Point(h.x+e*(f.x-h.x),h.y+e*(f.y-h.y)))}else{m=new c("No Intersection")}}else{if(i==0||j==0){m=new c("Coincident")}else{m=new c("Parallel")}}return m};b.Intersection.intersectLinePolygon=function(e,d,l){var m=new c("No Intersection"),f=l.length;for(var h=0;h0){m.status="Intersection"}return m};b.Intersection.intersectPolygonPolygon=function(j,h){var f=new c("No Intersection"),l=j.length;for(var k=0;k0){f.status="Intersection"}return f};b.Intersection.intersectPolygonRectangle=function(n,e,d){var g=e.min(d),m=e.max(d),f=new b.Point(m.x,g.y),l=new b.Point(g.x,m.y),k=c.intersectLinePolygon(g,f,n),j=c.intersectLinePolygon(f,m,n),i=c.intersectLinePolygon(m,l,n),h=c.intersectLinePolygon(l,g,n),o=new c("No Intersection");o.appendPoints(k.points);o.appendPoints(j.points);o.appendPoints(i.points);o.appendPoints(h.points);if(o.points.length>0){o.status="Intersection"}return o}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Color){b.warn("fabric.Color is already defined.");return}function c(d){if(!d){this.setSource([0,0,0,1])}else{this._tryParsingColor(d)}}b.Color=c;b.Color.prototype={_tryParsingColor:function(d){var e=c.sourceFromHex(d);if(!e){e=c.sourceFromRgb(d)}if(e){this.setSource(e)}},getSource:function(){return this._source},setSource:function(d){this._source=d},toRgb:function(){var d=this.getSource();return"rgb("+d[0]+","+d[1]+","+d[2]+")"},toRgba:function(){var d=this.getSource();return"rgba("+d[0]+","+d[1]+","+d[2]+","+d[3]+")"},toHex:function(){var h=this.getSource();var f=h[0].toString(16);f=(f.length==1)?("0"+f):f;var e=h[1].toString(16);e=(e.length==1)?("0"+e):e;var d=h[2].toString(16);d=(d.length==1)?("0"+d):d;return f.toUpperCase()+e.toUpperCase()+d.toUpperCase()},getAlpha:function(){return this.getSource()[3]},setAlpha:function(e){var d=this.getSource();d[3]=e;this.setSource(d);return this},toGrayscale:function(){var f=this.getSource(),e=parseInt((f[0]*0.3+f[1]*0.59+f[2]*0.11).toFixed(0),10),d=f[3];this.setSource([e,e,e,d]);return this},toBlackWhite:function(d){var g=this.getSource(),f=(g[0]*0.3+g[1]*0.59+g[2]*0.11).toFixed(0),e=g[3],d=d||127;f=(Number(f)','',"',"Created with Fabric.js ",fabric.version,"",fabric.createSVGFontFacesMarkup(this.getObjects())];if(this.backgroundImage){h.push('')}for(var j=0,k=this.getObjects(),g=k.length;j");return h.join("")},isEmpty:function(){return this._objects.length===0},remove:function(g){e(this._objects,g);if(this.getActiveObject()===g){this.fire("before:selection:cleared",{target:g});this.discardActiveObject();this.fire("selection:cleared")}this.renderAll();return g},sendToBack:function(g){e(this._objects,g);this._objects.unshift(g);return this.renderAll()},bringToFront:function(g){e(this._objects,g);this._objects.push(g);return this.renderAll()},sendBackwards:function(j){var h=this._objects.indexOf(j),g=h;if(h!==0){for(var k=h-1;k>=0;--k){if(j.intersectsWithObject(this._objects[k])||j.isContainedWithinObject(this._objects[k])){g=k;break}}e(this._objects,j);this._objects.splice(g,0,j)}return this.renderAll()},bringForward:function(k){var n=this.getObjects(),h=n.indexOf(k),g=h;if(h!==n.length-1){for(var m=h+1,j=this._objects.length;m"};f(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',toGrayscale:function(l){var k=l.getContext("2d"),g=k.getImageData(0,0,l.width,l.height),p=g.data,m=g.width,r=g.height,q,h,o,n;for(o=0;o0){if(B>this.targetFindTolerance){B-=this.targetFindTolerance}else{B=0}if(A>this.targetFindTolerance){A-=this.targetFindTolerance}else{A=0}}var v=true;var r=w.getImageData(B,A,(this.targetFindTolerance*2)||1,(this.targetFindTolerance*2)||1);for(var u=3;u0)?0:-v),r.ey-((u>0)?0:-u),t,s);this.contextTop.lineWidth=this.selectionLineWidth;this.contextTop.strokeStyle=this.selectionBorderColor;this.contextTop.strokeRect(r.ex+a-((v>0)?0:t),r.ey+a-((u>0)?0:s),t,s)},_findSelectedObjects:function(x){var y,t,D=[],s=this._groupSelector.ex,C=this._groupSelector.ey,r=s+this._groupSelector.left,A=C+this._groupSelector.top,z,w=new fabric.Point(f(s,r),f(C,A)),B=new fabric.Point(l(s,r),l(C,A));for(var u=0,v=this._objects.length;u1){var D=new fabric.Group(D);this.setActiveGroup(D);D.saveCoords();this.fire("selection:created",{target:D})}}this.renderAll()},findTarget:function(y,u){var z,r=this.getPointer(y);var t=this.getActiveGroup();if(t&&!u&&this.containsPoint(y,t)){z=t;return z}var s=[];for(var v=this._objects.length;v--;){if(this._objects[v]&&this.containsPoint(y,this._objects[v])){if(this.perPixelTargetFind||this._objects[v].perPixelTargetFind){s[s.length]=this._objects[v]}else{z=this._objects[v];this.relatedTarget=z;break}}}for(var v=0,x=s.length;v1)?q.apply(this,o.call(arguments,1)):q.call(this)},initialize:function(i){if(i){this.setOptions(i)}},_initGradient:function(i){if(i.fill&&typeof i.fill=="object"&&!(i.fill instanceof d.Gradient)){this.set("fill",new d.Gradient(i.fill))}},setOptions:function(q){var r=this.stateProperties.length,s;while(r--){s=this.stateProperties[r];if(s in q){this.set(s,q[s])}}this._initGradient(q)},transform:function(i){i.globalAlpha=this.opacity;i.translate(this.left,this.top);i.rotate(this._theta);i.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toObject:function(){var q=d.Object.NUM_FRACTION_DIGITS;var i={type:this.type,left:c(this.left,q),top:c(this.top,q),width:c(this.width,q),height:c(this.height,q),fill:(this.fill&&this.fill.toObject)?this.fill.toObject():this.fill,overlayFill:this.overlayFill,stroke:this.stroke,strokeWidth:this.strokeWidth,strokeDashArray:this.strokeDashArray,scaleX:c(this.scaleX,q),scaleY:c(this.scaleY,q),angle:c(this.getAngle(),q),flipX:this.flipX,flipY:this.flipY,opacity:c(this.opacity,q),selectable:this.selectable,hasControls:this.hasControls,hasBorders:this.hasBorders,hasRotatingPoint:this.hasRotatingPoint,transparentCorners:this.transparentCorners,perPixelTargetFind:this.perPixelTargetFind};if(!this.includeDefaultValues){i=this._removeDefaultValues(i)}return i},toDatalessObject:function(){return this.toObject()},getSvgStyles:function(){return["stroke: ",(this.stroke?this.stroke:"none"),"; ","stroke-width: ",(this.strokeWidth?this.strokeWidth:"0"),"; ","stroke-dasharray: ",(this.strokeDashArray?this.strokeDashArray.join(" "):"; "),"fill: ",(this.fill?this.fill:"none"),"; ","opacity: ",(this.opacity?this.opacity:"1"),";"].join("")},getSvgTransform:function(){var i=this.getAngle();return["translate(",c(this.left,2)," ",c(this.top,2),")",i!==0?(" rotate("+c(i,2)+")"):"",(this.scaleX===1&&this.scaleY===1)?"":(" scale("+c(this.scaleX,2)+" "+c(this.scaleY,2)+")")].join("")},_removeDefaultValues:function(q){var i=d.Object.prototype.options;if(i){this.stateProperties.forEach(function(r){if(q[r]===i[r]){delete q[r]}})}return q},isActive:function(){return !!this.active},setActive:function(i){this.active=!!i;return this},toString:function(){return"#"},set:function(i,q){if(typeof i==="object"){for(var r in i){this._set(r,i[r])}}else{if(typeof q==="function"){this._set(i,q(this.get(i)))}else{this._set(i,q)}}return this},_set:function(i,q){var r=(i==="scaleX"||i==="scaleY")&&q1?this.strokeWidth:0,B=this.padding;this.currentWidth=(this.width+z)*this.scaleX+B*2;this.currentHeight=(this.height+z)*this.scaleY+B*2;this._hypotenuse=Math.sqrt(Math.pow(this.currentWidth/2,2)+Math.pow(this.currentHeight/2,2));this._angle=Math.atan(this.currentHeight/this.currentWidth);var w=Math.cos(this._angle+this._theta)*this._hypotenuse,v=Math.sin(this._angle+this._theta)*this._hypotenuse,r=this._theta,A=Math.sin(r),y=Math.cos(r);var E={x:this.left-w,y:this.top-v};var x={x:E.x+(this.currentWidth*y),y:E.y+(this.currentWidth*A)};var D={x:x.x-(this.currentHeight*A),y:x.y+(this.currentHeight*y)};var s={x:E.x-(this.currentHeight*A),y:E.y+(this.currentHeight*y)};var u={x:E.x-(this.currentHeight/2*A),y:E.y+(this.currentHeight/2*y)};var i={x:E.x+(this.currentWidth/2*y),y:E.y+(this.currentWidth/2*A)};var q={x:x.x-(this.currentHeight/2*A),y:x.y+(this.currentHeight/2*y)};var C={x:s.x+(this.currentWidth/2*y),y:s.y+(this.currentWidth/2*A)};var t={x:E.x+(this.currentWidth/2*y),y:E.y+(this.currentWidth/2*A)};this.oCoords={tl:E,tr:x,br:D,bl:s,ml:u,mt:i,mr:q,mb:C,mtr:t};this._setCornerCoords();return this},getBoundingRectWidth:function(){this.oCoords||this.setCoords();var q=[this.oCoords.tl.x,this.oCoords.tr.x,this.oCoords.br.x,this.oCoords.bl.x];var i=d.util.array.min(q);var r=d.util.array.max(q);return Math.abs(i-r)},getBoundingRectHeight:function(){this.oCoords||this.setCoords();var i=[this.oCoords.tl.y,this.oCoords.tr.y,this.oCoords.br.y,this.oCoords.bl.y];var r=d.util.array.min(i);var q=d.util.array.max(i);return Math.abs(r-q)},drawBorders:function(A){if(!this.hasBorders){return}var t=d.Object.MIN_SCALE_LIMIT,v=this.padding,i=v*2,u=this.strokeWidth>1?this.strokeWidth:0;A.save();A.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;A.strokeStyle=this.borderColor;var z=1/(this.scaleXi){var C=x-i}if(E){z+=(D*E)-(C*E||0)}else{v+=(D*y)-(C*y||0)}B[1&s?"moveTo":"lineTo"](z,v);if(s>=u){s=0}}}q(1,0);q(0,1);q(-1,0);q(0,-1);B.stroke();B.closePath();B.restore()},drawCorners:function(B){if(!this.hasControls){return}var x=this.cornersize,r=x/2,i=this.strokeWidth/2,q=-(this.width/2),v=-(this.height/2),H,C,z=x/this.scaleX,w=x/this.scaleY,E=this.padding/this.scaleX,D=this.padding/this.scaleY,F=r/this.scaleY,G=r/this.scaleX,t=(r-x)/this.scaleX,s=(r-x)/this.scaleY,y=this.height,A=this.width,u=this.transparentCorners?"strokeRect":"fillRect";B.save();B.lineWidth=1/Math.max(this.scaleX,this.scaleY);B.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;B.strokeStyle=B.fillStyle=this.cornerColor;H=q-G-i-E;C=v-F-i-D;B.clearRect(H,C,z,w);B[u](H,C,z,w);H=q+A-G+i+E;C=v-F-i-D;B.clearRect(H,C,z,w);B[u](H,C,z,w);H=q-G-i-E;C=v+y+s+i+D;B.clearRect(H,C,z,w);B[u](H,C,z,w);H=q+A+t+i+E;C=v+y+s+i+D;B.clearRect(H,C,z,w);B[u](H,C,z,w);if(!this.lockUniScaling){H=q+A/2-G;C=v-F-i-D;B.clearRect(H,C,z,w);B[u](H,C,z,w);H=q+A/2-G;C=v+y+s+i+D;B.clearRect(H,C,z,w);B[u](H,C,z,w);H=q+A+t+i+E;C=v+y/2-F;B.clearRect(H,C,z,w);B[u](H,C,z,w);H=q-G-i-E;C=v+y/2-F;B.clearRect(H,C,z,w);B[u](H,C,z,w)}if(this.hasRotatingPoint){H=q+A/2-G;C=this.flipY?(v+y+(this.rotatingPointOffset/this.scaleY)-w/2+i+D):(v-(this.rotatingPointOffset/this.scaleY)-w/2-i-D);B.clearRect(H,C,z,w);B[u](H,C,z,w)}B.restore();return this},clone:function(i){if(this.constructor.fromObject){return this.constructor.fromObject(this.toObject(),i)}return new d.Object(this.toObject())},cloneAsImage:function(s){if(d.Image){var q=new Image();q.onload=function(){if(s){s(new d.Image(q),r)}q=q.onload=null};var r={angle:this.get("angle"),flipX:this.get("flipX"),flipY:this.get("flipY")};this.set("angle",0).set("flipX",false).set("flipY",false);this.toDataURL(function(i){q.src=i})}return this},toDataURL:function(s){var q=d.document.createElement("canvas");if(!q.getContext&&typeof G_vmlCanvasManager!="undefined"){G_vmlCanvasManager.initElement(q)}q.width=this.getBoundingRectWidth();q.height=this.getBoundingRectHeight();d.util.wrapElement(q,"div");var i=new d.Canvas(q);i.backgroundColor="transparent";i.renderAll();if(this.constructor.async){this.clone(r)}else{r(this.clone())}function r(u){u.left=q.width/2;u.top=q.height/2;u.setActive(false);i.add(u);var t=i.toDataURL("png");i.dispose();i=u=null;s&&s(t)}},hasStateChanged:function(){return this.stateProperties.some(function(i){return this[i]!==this.originalState[i]},this)},saveState:function(){this.stateProperties.forEach(function(i){this.originalState[i]=this.get(i)},this);return this},setupState:function(){this.originalState={};this.saveState()},intersectsWithRect:function(r,t){var w=this.oCoords,i=new d.Point(w.tl.x,w.tl.y),s=new d.Point(w.tr.x,w.tr.y),v=new d.Point(w.bl.x,w.bl.y),q=new d.Point(w.br.x,w.br.y);var u=d.Intersection.intersectPolygonRectangle([i,s,q,v],r,t);return(u.status==="Intersection")},intersectsWithObject:function(i){function q(u){return{tl:new d.Point(u.tl.x,u.tl.y),tr:new d.Point(u.tr.x,u.tr.y),bl:new d.Point(u.bl.x,u.bl.y),br:new d.Point(u.br.x,u.br.y)}}var r=q(this.oCoords),t=q(i.oCoords);var s=d.Intersection.intersectPolygonPolygon([r.tl,r.tr,r.br,r.bl],[t.tl,t.tr,t.br,t.bl]);return(s.status==="Intersection")},isContainedWithinObject:function(i){return this.isContainedWithinRect(i.oCoords.tl,i.oCoords.br)},isContainedWithinRect:function(r,t){var v=this.oCoords,i=new d.Point(v.tl.x,v.tl.y),s=new d.Point(v.tr.x,v.tr.y),u=new d.Point(v.bl.x,v.bl.y),q=new d.Point(v.br.x,v.br.y);return i.x>r.x&&s.xr.y&&u.y=v)&&(s.d.y>=v)){continue}if((s.o.x==s.d.x)&&(s.o.x>=w)){x=s.o.x;u=v}else{z=0;y=(s.d.y-s.o.y)/(s.d.x-s.o.x);r=v-z*w;q=s.o.y-y*s.o.x;x=-(r-q)/(z-y);u=r+z*x}if(x>=w){t+=1}if(t==2){break}}return t},_getImageLines:function(r,q){return{topline:{o:r.tl,d:r.tr},rightline:{o:r.tr,d:r.br},bottomline:{o:r.br,d:r.bl},leftline:{o:r.bl,d:r.tl}}},_setCornerCoords:function(){var u=this.oCoords,q=b(45-this.getAngle()),s=Math.sqrt(2*Math.pow(this.cornersize,2))/2,i=s*Math.cos(q),r=s*Math.sin(q),v=Math.sin(this._theta),t=Math.cos(this._theta);u.tl.corner={tl:{x:u.tl.x-r,y:u.tl.y-i},tr:{x:u.tl.x+i,y:u.tl.y-r},bl:{x:u.tl.x-i,y:u.tl.y+r},br:{x:u.tl.x+r,y:u.tl.y+i}};u.tr.corner={tl:{x:u.tr.x-r,y:u.tr.y-i},tr:{x:u.tr.x+i,y:u.tr.y-r},br:{x:u.tr.x+r,y:u.tr.y+i},bl:{x:u.tr.x-i,y:u.tr.y+r}};u.bl.corner={tl:{x:u.bl.x-r,y:u.bl.y-i},bl:{x:u.bl.x-i,y:u.bl.y+r},br:{x:u.bl.x+r,y:u.bl.y+i},tr:{x:u.bl.x+i,y:u.bl.y-r}};u.br.corner={tr:{x:u.br.x+i,y:u.br.y-r},bl:{x:u.br.x-i,y:u.br.y+r},br:{x:u.br.x+r,y:u.br.y+i},tl:{x:u.br.x-r,y:u.br.y-i}};u.ml.corner={tl:{x:u.ml.x-r,y:u.ml.y-i},tr:{x:u.ml.x+i,y:u.ml.y-r},bl:{x:u.ml.x-i,y:u.ml.y+r},br:{x:u.ml.x+r,y:u.ml.y+i}};u.mt.corner={tl:{x:u.mt.x-r,y:u.mt.y-i},tr:{x:u.mt.x+i,y:u.mt.y-r},bl:{x:u.mt.x-i,y:u.mt.y+r},br:{x:u.mt.x+r,y:u.mt.y+i}};u.mr.corner={tl:{x:u.mr.x-r,y:u.mr.y-i},tr:{x:u.mr.x+i,y:u.mr.y-r},bl:{x:u.mr.x-i,y:u.mr.y+r},br:{x:u.mr.x+r,y:u.mr.y+i}};u.mb.corner={tl:{x:u.mb.x-r,y:u.mb.y-i},tr:{x:u.mb.x+i,y:u.mb.y-r},bl:{x:u.mb.x-i,y:u.mb.y+r},br:{x:u.mb.x+r,y:u.mb.y+i}};u.mtr.corner={tl:{x:u.mtr.x-r+(v*this.rotatingPointOffset),y:u.mtr.y-i-(t*this.rotatingPointOffset)},tr:{x:u.mtr.x+i+(v*this.rotatingPointOffset),y:u.mtr.y-r-(t*this.rotatingPointOffset)},bl:{x:u.mtr.x-i+(v*this.rotatingPointOffset),y:u.mtr.y+r-(t*this.rotatingPointOffset)},br:{x:u.mtr.x+r+(v*this.rotatingPointOffset),y:u.mtr.y+i-(t*this.rotatingPointOffset)}}},toGrayscale:function(){var i=this.get("fill");if(i){this.set("overlayFill",new d.Color(i).toGrayscale().toRgb())}return this},complexity:function(){return 0},toJSON:function(){return this.toObject()},setGradientFill:function(i){this.set("fill",d.Gradient.forObject(this,i))},animate:function(){if(arguments[0]&&typeof arguments[0]=="object"){for(var i in arguments[0]){this._animate(i,arguments[0][i],arguments[1])}}else{this._animate.apply(this,arguments)}return this},_animate:function(q,s,i){var r=this;i||(i={});if(!("from" in i)){i.from=this.get(q)}if(/[+-]/.test((s+"").charAt(0))){s=this.get(q)+parseFloat(s)}d.util.animate({startValue:i.from,endValue:s,byValue:i.by,easing:i.easing,duration:i.duration,onChange:function(t){r.set(q,t);i.onChange&&i.onChange()},onComplete:function(){r.setCoords();i.onComplete&&i.onComplete()}})},centerH:function(){this.canvas.centerObjectH(this);return this},centerV:function(){this.canvas.centerObjectV(this);return this},center:function(){return this.centerH().centerV()},remove:function(){return this.canvas.remove(this)},sendToBack:function(){this.canvas.sendToBack(this);return this},bringToFront:function(){this.canvas.bringToFront(this);return this},sendBackwards:function(){this.canvas.sendBackwards(this);return this},bringForward:function(){this.canvas.bringForward(this);return this}});d.Object.prototype.rotate=d.Object.prototype.setAngle;var j=d.Object.prototype;for(var g=j.stateProperties.length;g--;){var h=j.stateProperties[g],e=h.charAt(0).toUpperCase()+h.slice(1),f="set"+e,n="get"+e;if(!j[n]){j[n]=(function(i){return new Function('return this.get("'+i+'")')})(h)}if(!j[f]){j[f]=(function(i){return new Function("value",'return this.set("'+i+'", value)')})(h)}}l(d.Object.prototype,d.Observable);l(d.Object,{NUM_FRACTION_DIGITS:2,MIN_SCALE_LIMIT:0.1})})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),e=c.util.object.extend,d=c.Object.prototype.set,a={x1:1,x2:1,y1:1,y2:1};if(c.Line){c.warn("fabric.Line is already defined");return}c.Line=c.util.createClass(c.Object,{type:"line",initialize:function(g,f){if(!g){g=[0,0,0,0]}this.callSuper("initialize",f);this.set("x1",g[0]);this.set("y1",g[1]);this.set("x2",g[2]);this.set("y2",g[3]);this._setWidthHeight(f)},_setWidthHeight:function(f){f||(f={});this.set("width",(this.x2-this.x1)||1);this.set("height",(this.y2-this.y1)||1);this.set("left","left" in f?f.left:(this.x1+this.width/2));this.set("top","top" in f?f.top:(this.y1+this.height/2))},_set:function(f,g){this[f]=g;if(f in a){this._setWidthHeight()}return this},_render:function(f){f.beginPath();if(this.group){f.translate(-this.group.width/2+this.left,-this.group.height/2+this.top)}f.moveTo(this.width===1?0:(-this.width/2),this.height===1?0:(-this.height/2));f.lineTo(this.width===1?0:(this.width/2),this.height===1?0:(this.height/2));f.lineWidth=this.strokeWidth;var g=f.strokeStyle;f.strokeStyle=f.fillStyle;f.stroke();f.strokeStyle=g},complexity:function(){return 1},toObject:function(){return e(this.callSuper("toObject"),{x1:this.get("x1"),y1:this.get("y1"),x2:this.get("x2"),y2:this.get("y2")})},toSVG:function(){return[""].join("")}});c.Line.ATTRIBUTE_NAMES="x1 y1 x2 y2 stroke stroke-width transform".split(" ");c.Line.fromElement=function(g,f){var i=c.parseAttributes(g,c.Line.ATTRIBUTE_NAMES);var h=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new c.Line(h,e(i,f))};c.Line.fromObject=function(f){var g=[f.x1,f.y1,f.x2,f.y2];return new c.Line(g,f)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),d=Math.PI*2,e=b.util.object.extend;if(b.Circle){b.warn("fabric.Circle is already defined.");return}b.Circle=b.util.createClass(b.Object,{type:"circle",initialize:function(f){f=f||{};this.set("radius",f.radius||0);this.callSuper("initialize",f);var g=this.get("radius")*2;this.set("width",g).set("height",g)},toObject:function(){return e(this.callSuper("toObject"),{radius:this.get("radius")})},toSVG:function(){return('')},_render:function(f,g){f.beginPath();f.globalAlpha*=this.opacity;f.arc(g?this.left:0,g?this.top:0,this.radius,0,d,false);f.closePath();if(this.fill){f.fill()}if(this.stroke){f.stroke()}},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(f){this.radius=f;this.set("width",f*2).set("height",f*2)},complexity:function(){return 1}});b.Circle.ATTRIBUTE_NAMES="cx cy r fill fill-opacity opacity stroke stroke-width transform".split(" ");b.Circle.fromElement=function(g,f){f||(f={});var h=b.parseAttributes(g,b.Circle.ATTRIBUTE_NAMES);if(!c(h)){throw Error("value of `r` attribute is required and can not be negative")}if("left" in h){h.left-=(f.width/2)||0}if("top" in h){h.top-=(f.height/2)||0}return new b.Circle(e(h,f))};function c(f){return(("radius" in f)&&(f.radius>0))}b.Circle.fromObject=function(f){return new b.Circle(f)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Triangle){b.warn("fabric.Triangle is already defined");return}b.Triangle=b.util.createClass(b.Object,{type:"triangle",initialize:function(c){c=c||{};this.callSuper("initialize",c);this.set("width",c.width||100).set("height",c.height||100)},_render:function(c){var d=this.width/2,e=this.height/2;c.beginPath();c.moveTo(-d,e);c.lineTo(0,-e);c.lineTo(d,e);c.closePath();if(this.fill){c.fill()}if(this.stroke){c.stroke()}},complexity:function(){return 1},toSVG:function(){var c=this.width/2,d=this.height/2;var e=[-c+" "+d,"0 "+-d,c+" "+d].join(",");return''}});b.Triangle.fromObject=function(c){return new b.Triangle(c)}})(typeof exports!="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),c=Math.PI*2,d=b.util.object.extend;if(b.Ellipse){b.warn("fabric.Ellipse is already defined.");return}b.Ellipse=b.util.createClass(b.Object,{type:"ellipse",initialize:function(e){e=e||{};this.callSuper("initialize",e);this.set("rx",e.rx||0);this.set("ry",e.ry||0);this.set("width",this.get("rx")*2);this.set("height",this.get("ry")*2)},toObject:function(){return d(this.callSuper("toObject"),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(){return[""].join("")},render:function(e,f){if(this.rx===0||this.ry===0){return}return this.callSuper("render",e,f)},_render:function(e,f){e.beginPath();e.save();e.globalAlpha*=this.opacity;if(this.transformMatrix&&this.group){e.translate(this.cx,this.cy)}e.transform(1,0,0,this.ry/this.rx,0,0);e.arc(f?this.left:0,f?this.top:0,this.rx,0,c,false);if(this.stroke){e.stroke()}if(this.fill){e.fill()}e.restore()},complexity:function(){return 1}});b.Ellipse.ATTRIBUTE_NAMES="cx cy rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");b.Ellipse.fromElement=function(g,f){f||(f={});var i=b.parseAttributes(g,b.Ellipse.ATTRIBUTE_NAMES);var e=i.left;var j=i.top;if("left" in i){i.left-=(f.width/2)||0}if("top" in i){i.top-=(f.height/2)||0}var h=new b.Ellipse(d(i,f));h.cx=e||0;h.cy=j||0;return h};b.Ellipse.fromObject=function(e){return new b.Ellipse(e)}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={});if(c.Rect){console.warn("fabric.Rect is already defined");return}c.Rect=c.util.createClass(c.Object,{type:"rect",rx:0,ry:0,initialize:function(d){this._initStateProperties();this.callSuper("initialize",d);this._initRxRy()},_initStateProperties:function(){this.stateProperties=this.stateProperties.concat(["rx","ry"])},_initRxRy:function(){if(this.rx&&!this.ry){this.ry=this.rx}else{if(this.ry&&!this.rx){this.rx=this.ry}}},_render:function(f){var j=this.rx||0,i=this.ry||0,d=-this.width/2,k=-this.height/2,e=this.width,g=this.height;f.beginPath();f.globalAlpha*=this.opacity;if(this.transformMatrix&&this.group){f.translate(this.width/2+this.x,this.height/2+this.y)}if(!this.transformMatrix&&this.group){f.translate(-this.group.width/2+this.width/2+this.x,-this.group.height/2+this.height/2+this.y)}f.moveTo(d+j,k);f.lineTo(d+e-j,k);f.quadraticCurveTo(d+e,k,d+e,k+i,d+e,k+i);f.lineTo(d+e,k+g-i);f.quadraticCurveTo(d+e,k+g,d+e-j,k+g,d+e-j,k+g);f.lineTo(d+j,k+g);f.quadraticCurveTo(d,k+g,d,k+g-i,d,k+g-i);f.lineTo(d,k+i);f.quadraticCurveTo(d,k,d+j,k,d+j,k);f.closePath();if(this.fill){f.fill()}if(this.strokeDashArray){this._renderDashedStroke(f)}else{if(this.stroke){f.stroke()}}},_normalizeLeftTopProperties:function(d){if(d.left){this.set("left",d.left+this.getWidth()/2)}this.set("x",d.left||0);if(d.top){this.set("top",d.top+this.getHeight()/2)}this.set("y",d.top||0);return this},complexity:function(){return 1},toObject:function(){return c.util.object.extend(this.callSuper("toObject"),{rx:this.get("rx")||0,ry:this.get("ry")||0})},toSVG:function(){return''}});c.Rect.ATTRIBUTE_NAMES="x y width height rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");function a(d){d.left=d.left||0;d.top=d.top||0;return d}c.Rect.fromElement=function(e,d){if(!e){return null}var g=c.parseAttributes(e,c.Rect.ATTRIBUTE_NAMES);g=a(g);var f=new c.Rect(c.util.object.extend((d?c.util.object.clone(d):{}),g));f._normalizeLeftTopProperties(g);return f};c.Rect.fromObject=function(d){return new c.Rect(d)}})(typeof exports!="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),a=c.util.toFixed;if(c.Polyline){c.warn("fabric.Polyline is already defined");return}c.Polyline=c.util.createClass(c.Object,{type:"polyline",initialize:function(e,d){d=d||{};this.set("points",e);this.callSuper("initialize",d);this._calcDimensions()},_calcDimensions:function(){return c.Polygon.prototype._calcDimensions.call(this)},toObject:function(){return c.Polygon.prototype.toObject.call(this)},toSVG:function(){var f=[];for(var e=0,d=this.points.length;e"].join("")},_render:function(f){var e;f.beginPath();f.moveTo(this.points[0].x,this.points[0].y);for(var g=0,d=this.points.length;g"].join("")},_render:function(l){var k;l.beginPath();l.moveTo(this.points[0].x,this.points[0].y);for(var m=0,j=this.points.length;m1){E=Math.sqrt(E);O*=E;N*=E}var R=aa/O;var Q=W/O;var D=(-W)/N;var C=(aa)/N;var H=R*M+Q*L;var q=D*M+C*L;var F=R*T+Q*S;var ab=D*T+C*S;var Z=(F-H)*(F-H)+(ab-q)*(ab-q);var U=1/Z-0.25;if(U<0){U=0}var w=Math.sqrt(U);if(P==J){w=-w}var V=0.5*(H+F)-w*(ab-q);var K=0.5*(q+ab)+w*(F-H);var v=Math.atan2(q-K,H-V);var u=Math.atan2(ab-K,F-V);var Y=u-v;if(Y<0&&P==1){Y+=2*Math.PI}else{if(Y>0&&P==0){Y-=2*Math.PI}}var B=Math.ceil(Math.abs(Y/(Math.PI*0.5+0.001)));var I=[];for(var X=0;X"},toObject:function(){var q=g(this.callSuper("toObject"),{path:this.path});if(this.sourcePath){q.sourcePath=this.sourcePath}if(this.transformMatrix){q.transformMatrix=this.transformMatrix}return q},toDatalessObject:function(){var q=this.toObject();if(this.sourcePath){q.path=this.sourcePath}delete q.sourcePath;return q},toSVG:function(){var t=[];for(var r=0,q=this.path.length;r',"',""].join("")},complexity:function(){return this.path.length},_parsePath:function(){var C=[],z,v,y;for(var u=0,t,q,w=this.path.length;uB){for(var r=1,x=q.length;r"];for(var l=0,j=m.length;l");return k.join("")},toString:function(){return"#"},isSameColor:function(){var j=this.getObjects()[0].get("fill");return this.getObjects().every(function(k){return k.get("fill")===j})},complexity:function(){return this.paths.reduce(function(j,k){return j+((k&&k.complexity)?k.complexity():0)},0)},toGrayscale:function(){var j=this.paths.length;while(j--){this.paths[j].toGrayscale()}return this},getObjects:function(){return this.paths}});function c(m){for(var l=0,j=m.length;l"},getObjects:function(){return this.objects},addWithUpdate:function(h){this._restoreObjectsState();this.objects.push(h);this._calcBounds();this._updateObjectsCoords();return this},removeWithUpdate:function(h){this._restoreObjectsState();f(this.objects,h);h.setActive(false);this._calcBounds();this._updateObjectsCoords();return this},add:function(h){this.objects.push(h);return this},remove:function(h){f(this.objects,h);return this},size:function(){return this.getObjects().length},_set:function(j,k){if(j==="fill"||j==="opacity"){var h=this.objects.length;this[j]=k;while(h--){this.objects[h].set(j,k)}}else{this[j]=k}},contains:function(h){return this.objects.indexOf(h)>-1},toObject:function(){return g(this.callSuper("toObject"),{objects:b(this.objects,"toObject")})},render:function(j,o){j.save();this.transform(j);var n=Math.max(this.scaleX,this.scaleY);for(var l=0,h=this.objects.length,k;k=this.objects[l];l++){var m=k.borderScaleFactor;k.borderScaleFactor=n;k.render(j);k.borderScaleFactor=m}if(!o&&this.active){this.drawBorders(j);this.hideCorners||this.drawCorners(j)}j.restore();this.setCoords()},item:function(h){return this.getObjects()[h]},complexity:function(){return this.getObjects().reduce(function(i,h){i+=(typeof h.complexity=="function")?h.complexity():0;return i},0)},_restoreObjectsState:function(){this.objects.forEach(this._restoreObjectState,this);return this},_restoreObjectState:function(j){var l=this.get("left"),m=this.get("top"),h=this.getAngle()*(Math.PI/180),k=j.get("originalLeft"),n=j.get("originalTop"),i=Math.cos(h)*j.get("top")+Math.sin(h)*j.get("left"),o=-Math.sin(h)*j.get("top")+Math.cos(h)*j.get("left");j.setAngle(j.getAngle()+this.getAngle());j.set("left",l+o*this.get("scaleX"));j.set("top",m+i*this.get("scaleY"));j.set("scaleX",j.get("scaleX")*this.get("scaleX"));j.set("scaleY",j.get("scaleY")*this.get("scaleY"));j.setCoords();j.hideCorners=false;j.setActive(false);j.setCoords();return this},destroy:function(){return this._restoreObjectsState()},saveCoords:function(){this._originalLeft=this.get("left");this._originalTop=this.get("top");return this},hasMoved:function(){return this._originalLeft!==this.get("left")||this._originalTop!==this.get("top")},setObjectsCoords:function(){this.forEachObject(function(h){h.setCoords()});return this},activateAllObjects:function(){this.forEachObject(function(h){h.setActive()});return this},forEachObject:e.StaticCanvas.prototype.forEachObject,_setOpacityIfSame:function(){var j=this.getObjects(),i=j[0]?j[0].get("opacity"):1;var h=j.every(function(k){return k.get("opacity")===i});if(h){this.opacity=i}},_calcBounds:function(){var s=[],q=[],p,n,k,h,m,l,u,r=0,t=this.objects.length;for(;ri.x&&j-hi.y},toGrayscale:function(){var h=this.objects.length;while(h--){this.objects[h].toGrayscale()}},toSVG:function(){var k=[];for(var j=0,h=this.objects.length;j'+k.join("")+"")}});e.Group.fromObject=function(h,i){e.util.enlivenObjects(h.objects,function(j){delete h.objects;i&&i(new e.Group(j,h))})};e.Group.async=true})(typeof exports!="undefined"?exports:this);(function(a){var b=fabric.util.object.extend;if(!a.fabric){a.fabric={}}if(a.fabric.Image){fabric.warn("fabric.Image is already defined.");return}if(!fabric.Object){fabric.warn("fabric.Object is required for fabric.Image initialization");return}fabric.Image=fabric.util.createClass(fabric.Object,{active:false,bordervisibility:false,cornervisibility:false,type:"image",initialize:function(d,c){c||(c={});this.callSuper("initialize",c);this._initElement(d);this._originalImage=this.getElement();this._initConfig(c);this.filters=[];if(c.filters){this.filters=c.filters;this.applyFilters()}},getElement:function(){return this._element},setElement:function(c){this._element=c;this._initConfig();return this},getOriginalSize:function(){var c=this.getElement();return{width:c.width,height:c.height}},setBorderVisibility:function(c){this._resetWidthHeight();this._adjustWidthHeightToBorders(showBorder);this.setCoords()},setCornersVisibility:function(c){this.cornervisibility=!!c},render:function(d,e){d.save();var c=this.transformMatrix;this._resetWidthHeight();if(this.group){d.translate(-this.group.width/2+this.width/2,-this.group.height/2+this.height/2)}if(c){d.transform(c[0],c[1],c[2],c[3],c[4],c[5])}if(!e){this.transform(d)}this._render(d);if(this.active&&!e){this.drawBorders(d);this.hideCorners||this.drawCorners(d)}d.restore()},toObject:function(){return b(this.callSuper("toObject"),{src:this._originalImage.src||this._originalImage._src,filters:this.filters.concat()})},toSVG:function(){return''},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(c){this.constructor.fromObject(this.toObject(),c)},applyFilters:function(i){if(this.filters.length===0){this.setElement(this._originalImage);i&&i();return}var c=typeof Buffer!=="undefined"&&typeof window==="undefined",g=this._originalImage,e=fabric.document.createElement("canvas"),f=c?new (require("canvas").Image):fabric.document.createElement("img"),h=this;if(!e.getContext&&typeof G_vmlCanvasManager!="undefined"){G_vmlCanvasManager.initElement(e)}e.width=g.width;e.height=g.height;e.getContext("2d").drawImage(g,0,0,g.width,g.height);this.filters.forEach(function(j){j&&j.applyTo(e)});f.onload=function(){h._element=f;i&&i();f.onload=e=g=null};f.width=g.width;f.height=g.height;if(c){var d=e.toDataURL("image/png").replace(/data:image\/png;base64,/,"");f.src=new Buffer(d,"base64");h._element=f;i&&i()}else{f.src=e.toDataURL("image/png")}return this},_render:function(c){c.drawImage(this.getElement(),-this.width/2,-this.height/2,this.width,this.height)},_adjustWidthHeightToBorders:function(c){if(c){this.currentBorder=this.borderwidth;this.width+=(2*this.currentBorder);this.height+=(2*this.currentBorder)}else{this.currentBorder=0}},_resetWidthHeight:function(){var c=this.getElement();this.set("width",c.width);this.set("height",c.height)},_initElement:function(c){this.setElement(fabric.util.getById(c));fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(c){c||(c={});this.setOptions(c);this._setBorder();this._setWidthHeight(c)},_initFilters:function(c){if(c.filters&&c.filters.length){this.filters=c.filters.map(function(d){return d&&fabric.Image.filters[d.type].fromObject(d)})}},_setBorder:function(){if(this.bordervisibility){this.currentBorder=this.borderwidth}else{this.currentBorder=0}},_setWidthHeight:function(c){var d=2*this.currentBorder;this.width="width" in c?c.width:((this.getElement().width||0)+d);this.height="height" in c?c.height:((this.getElement().height||0)+d)},complexity:function(){return 1}});fabric.Image.CSS_CANVAS="canvas-img";fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc;fabric.Image.fromObject=function(d,f){var c=fabric.document.createElement("img"),e=d.src;if(d.width){c.width=d.width}if(d.height){c.height=d.height}c.onload=function(){fabric.Image.prototype._initFilters.call(d,d);var g=new fabric.Image(c,d);f&&f(g);c=c.onload=null};c.src=e};fabric.Image.fromURL=function(d,f,e){var c=fabric.document.createElement("img");c.onload=function(){if(f){f(new fabric.Image(c,e))}c=c.onload=null};c.src=d};fabric.Image.ATTRIBUTE_NAMES="x y width height fill fill-opacity opacity stroke stroke-width transform xlink:href".split(" ");fabric.Image.fromElement=function(d,f,c){c||(c={});var e=fabric.parseAttributes(d,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(e["xlink:href"],f,b(e,c))};fabric.Image.async=true})(typeof exports!="undefined"?exports:this);fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var a=this.get("angle");if(a>-225&&a<=-135){return -180}else{if(a>-135&&a<=-45){return -90}else{if(a>-45&&a<=45){return 0}else{if(a>45&&a<=135){return 90}else{if(a>135&&a<=225){return 180}else{if(a>225&&a<=315){return 270}else{if(a>315){return 360}}}}}}}return 0},straighten:function(){var a=this._getAngleValueForStraighten();this.setAngle(a);return this},fxStraighten:function(b){b=b||{};var c=function(){},d=b.onComplete||c,a=b.onChange||c,e=this;fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(f){e.setAngle(f);a()},onComplete:function(){e.setCoords();d()},onStart:function(){e.setActive(false)}});return this}});fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(a){a.straighten();this.renderAll();return this},fxStraightenObject:function(a){a.fxStraighten({onChange:this.renderAll.bind(this)});return this}});fabric.Image.filters={};fabric.Image.filters.Grayscale=fabric.util.createClass({type:"Grayscale",applyTo:function(d){var c=d.getContext("2d"),a=c.getImageData(0,0,d.width,d.height),h=a.data,e=a.width,l=a.height,k,b,g,f;for(g=0;gh&&m>h&&o>h&&p(a-m)0){l[m]=o;l[m+1]=e;l[m+2]=k}}f.putImageData(c,0,0)},toJSON:function(){return{type:this.type,color:this.color}}});fabric.Image.filters.Tint.fromObject=function(a){return new fabric.Image.filters.Tint(a)};(function(b){var c=b.fabric||(b.fabric={}),e=c.util.object.extend,d=c.util.object.clone,a=c.util.toFixed;if(c.Text){c.warn("fabric.Text is already defined");return}if(!c.Object){c.warn("fabric.Text requires fabric.Object");return}c.Text=c.util.createClass(c.Object,{fontSize:40,fontWeight:100,fontFamily:"Times New Roman",textDecoration:"",textShadow:"",textAlign:"left",fontStyle:"",lineHeight:1.3,strokeStyle:"",strokeWidth:1,backgroundColor:"",path:null,type:"text",useNative:true,initialize:function(g,f){this._initStateProperties();this.text=g;this.setOptions(f||{});this._theta=this.angle*Math.PI/180;this._initDimensions();this.setCoords()},_initDimensions:function(){var f=c.document.createElement("canvas");if(!f.getContext&&typeof G_vmlCanvasManager!="undefined"){G_vmlCanvasManager.initElement(f)}this._render(f.getContext("2d"))},_initStateProperties:function(){this.stateProperties=this.stateProperties.concat();this.stateProperties.push("fontFamily","fontWeight","fontSize","path","text","textDecoration","textShadow","textAlign","fontStyle","lineHeight","strokeStyle","strokeWidth","backgroundColor","useNative");c.util.removeFromArray(this.stateProperties,"width")},toString:function(){return"#'},_render:function(f){if(typeof Cufon==="undefined"||this.useNative===true){this._renderViaNative(f)}else{this._renderViaCufon(f)}},_renderViaCufon:function(f){var h=Cufon.textOptions||(Cufon.textOptions={});h.left=this.left;h.top=this.top;h.context=f;h.color=this.fill;var g=this._initDummyElementForCufon();this.transform(f);Cufon.replaceElement(g,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor});this.width=h.width;this.height=h.height;this._totalLineHeight=h.totalLineHeight;this._fontAscent=h.fontAscent;this._boundaries=h.boundaries;this._shadowOffsets=h.shadowOffsets;this._shadows=h.shadows||[];g=null;this.setCoords()},_renderViaNative:function(f){this.transform(f);this._setTextStyles(f);var g=this.text.split(/\r?\n/);this.width=this._getTextWidth(f,g);this.height=this._getTextHeight(f,g);this._renderTextBackground(f,g);if(this.textAlign!=="left"){f.save();f.translate(this.textAlign==="center"?(this.width/2):this.width,0)}this._setTextShadow(f);this._renderTextFill(f,g);this.textShadow&&f.restore();this._renderTextStroke(f,g);if(this.textAlign!=="left"){f.restore()}this._renderTextDecoration(f,g);this._setBoundaries(f,g);this._totalLineHeight=0;this.setCoords()},_setBoundaries:function(h,k){this._boundaries=[];for(var j=0,g=k.length;jk){k=l}}return k},_setTextShadow:function(f){if(this.textShadow){var j=/\s+(-?\d+)(?:px)?\s+(-?\d+)(?:px)?\s+(\d+)(?:px)?\s*/;var g=this.textShadow;var i=j.exec(this.textShadow);var h=g.replace(j,"");f.save();f.shadowColor=h;f.shadowOffsetX=parseInt(i[1],10);f.shadowOffsetY=parseInt(i[2],10);f.shadowBlur=parseInt(i[3],10);this._shadows=[{blur:f.shadowBlur,color:f.shadowColor,offX:f.shadowOffsetX,offY:f.shadowOffsetY}];this._shadowOffsets=[[parseInt(f.shadowOffsetX,10),parseInt(f.shadowOffsetY,10)]]}},_renderTextFill:function(g,j){this._boundaries=[];for(var h=0,f=j.length;h-1){f.call(this,this.fontSize)}if(this.textDecoration.indexOf("line-through")>-1){f.call(this,this.fontSize/2)}if(this.textDecoration.indexOf("overline")>-1){f.call(this,0)}},_getFontDeclaration:function(){return[this.fontStyle,this.fontWeight,this.fontSize+"px",(c.isLikelyNode?('"'+this.fontFamily+'"'):this.fontFamily)].join(" ")},_initDummyElementForCufon:function(){var g=c.document.createElement("pre"),f=c.document.createElement("div");f.appendChild(g);if(typeof G_vmlCanvasManager=="undefined"){g.innerHTML=this.text}else{g.innerText=this.text.replace(/\r?\n/gi,"\r")}g.style.fontSize=this.fontSize+"px";g.style.letterSpacing="normal";return g},render:function(f,g){f.save();this._render(f);if(!g&&this.active){this.drawBorders(f);this.hideCorners||this.drawCorners(f)}f.restore()},toObject:function(){return e(this.callSuper("toObject"),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,path:this.path,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor,useNative:this.useNative})},toSVG:function(){var i=this.text.split(/\r?\n/),j=this.useNative?this.fontSize*this.lineHeight:(-this._fontAscent-((this._fontAscent/5)*this.lineHeight)),g=-(this.width/2),f=this.useNative?this.fontSize-1:(this.height/2)-(i.length*this.fontSize)-this._totalLineHeight,h=this._getSVGTextAndBg(j,g,i),k=this._getSVGShadows(j,i);f+=(this._fontAscent?((this._fontAscent/5)*this.lineHeight):0);return['',h.textBgRects.join(""),"',k.join(""),h.textSpans.join(""),"",""].join("")},_getSVGShadows:function(h,n){var o=[],k,l,p,g,f=1;if(!this._shadows||!this._boundaries){return o}for(k=0,p=this._shadows.length;k",c.util.string.escapeXml(n[l]),"");f=1}else{f++}}}return o},_getSVGTextAndBg:function(j,h,n){var g=[],k=[],l,m,o,f=1;for(l=0,o=n.length;l",c.util.string.escapeXml(n[l]),"");f=1}else{f++}if(!this.backgroundColor||!this._boundaries){continue}k.push("')}return{textSpans:g,textBgRects:k}},_getFillAttributes:function(f){var g=f?new c.Color(f):"";if(!g||!g.getSource()||g.getAlpha()===1){return'fill="'+f+'"'}return'opacity="'+g.getAlpha()+'" fill="'+g.setAlpha(1).toRgb()+'"'},setColor:function(f){this.set("fill",f);return this},setFontsize:function(f){this.set("fontSize",f);this._initDimensions();this.setCoords();return this},getText:function(){return this.text},setText:function(f){this.set("text",f);this._initDimensions();this.setCoords();return this},_set:function(f,g){if(f==="fontFamily"&&this.path){this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+g+"$3")}this.callSuper("_set",f,g)}});c.Text.ATTRIBUTE_NAMES=("x y fill fill-opacity opacity stroke stroke-width transform font-family font-style font-weight font-size text-decoration").split(" ");c.Text.fromObject=function(f){return new c.Text(f.text,d(f))};c.Text.fromElement=function(g,f){if(!g){return null}var h=c.parseAttributes(g,c.Text.ATTRIBUTE_NAMES);var f=c.util.object.extend((f?c.util.object.clone(f):{}),h);var i=new c.Text(g.textContent,f);return i}})(typeof exports!="undefined"?exports:this);(function(){if(typeof document!="undefined"&&typeof window!="undefined"){return}var DOMParser=new require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),Canvas=require("canvas"),Image=require("canvas").Image;function request(url,encoding,callback){var oURL=URL.parse(url),client=HTTP.createClient(oURL.port,oURL.hostname),request=client.request("GET",oURL.pathname,{host:oURL.hostname});client.addListener("error",function(err){if(err.errno===process.ECONNREFUSED){fabric.log("ECONNREFUSED: connection refused to "+client.host+":"+client.port)}else{fabric.log(err.message)}});request.end();request.on("response",function(response){var body="";if(encoding){response.setEncoding(encoding)}response.on("end",function(){callback(body)});response.on("data",function(chunk){if(response.statusCode==200){body+=chunk}})})}fabric.util.loadImage=function(url,callback){request(url,"binary",function(body){var img=new Image();img.src=new Buffer(body,"binary");img._src=url;callback(img)})};fabric.loadSVGFromURL=function(url,callback){url=url.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim();request(url,"",function(body){fabric.loadSVGFromString(body,callback)})};fabric.loadSVGFromString=function(string,callback){var doc=new DOMParser().parseFromString(string);fabric.parseSVGDocument(doc.documentElement,function(results,options){callback(results,options)})};fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body);callback&&callback()})};fabric.Image.fromObject=function(object,callback){fabric.util.loadImage(object.src,function(img){var oImg=new fabric.Image(img);oImg._initConfig(object);oImg._initFilters(object);callback(oImg)})};fabric.createCanvasForNode=function(width,height){var canvasEl=fabric.document.createElement("canvas"),nodeCanvas=new Canvas(width||600,height||600);canvasEl.style={};canvasEl.width=nodeCanvas.width;canvasEl.height=nodeCanvas.height;var canvas=fabric.Canvas||fabric.StaticCanvas;var fabricCanvas=new canvas(canvasEl);fabricCanvas.contextContainer=nodeCanvas.getContext("2d");fabricCanvas.nodeCanvas=nodeCanvas;return fabricCanvas};fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()};if(fabric.Canvas){fabric.Canvas.prototype.createPNGStream}var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(width){origSetWidth.call(this);this.nodeCanvas.width=width;return this};if(fabric.Canvas){fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth}var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(height){origSetHeight.call(this);this.nodeCanvas.height=height;return this};if(fabric.Canvas){fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight}})(); \ No newline at end of file +var Cufon=(function(){var k=function(){return k.replace.apply(null,arguments)};var u=k.DOM={ready:(function(){var z=false,B={loaded:1,complete:1};var y=[],A=function(){if(z){return}z=true;for(var C;C=y.shift();C()){}};if(fabric.document.addEventListener){fabric.document.addEventListener("DOMContentLoaded",A,false);fabric.window.addEventListener("pageshow",A,false)}if(!fabric.window.opera&&fabric.document.readyState){(function(){B[fabric.document.readyState]?A():setTimeout(arguments.callee,10)})()}if(fabric.document.readyState&&fabric.document.createStyleSheet){(function(){try{fabric.document.body.doScroll("left");A()}catch(C){setTimeout(arguments.callee,1)}})()}o(fabric.window,"load",A);return function(C){if(!arguments.length){A()}else{z?C():y.push(C)}}})()};var l=k.CSS={Size:function(z,y){this.value=parseFloat(z);this.unit=String(z).match(/[a-z%]*$/)[0]||"px";this.convert=function(A){return A/y*this.value};this.convertFrom=function(A){return A/this.value*y};this.toString=function(){return this.value+this.unit}},getStyle:function(y){return new a(y.style)},quotedList:i(function(B){var A=[],z=/\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g,y;while(y=z.exec(B)){A.push(y[3]||y[1])}return A}),ready:(function(){var A=false;var z=[],B=function(){A=true;for(var D;D=z.shift();D()){}};var y=Object.prototype.propertyIsEnumerable?f("style"):{length:0};var C=f("link");u.ready(function(){var G=0,F;for(var E=0,D=C.length;F=C[E],E=y.length+G){B()}else{setTimeout(arguments.callee,10)}});return function(D){if(A){D()}else{z.push(D)}}})(),supports:function(A,z){var y=fabric.document.createElement("span").style;if(y[A]===undefined){return false}y[A]=z;return y[A]===z},textAlign:function(B,A,y,z){if(A.get("textAlign")=="right"){if(y>0){B=" "+B}}else{if(y400}if(F==500){F=400}for(var G in D){G=parseInt(G,10);if(!C||GA){A=G}H.push(G)}if(FA){F=A}H.sort(function(J,I){return(B?(J>F&&I>F)?JI:(JI:Jz){z=e}L.push(e);e=0;continue}var B=ab.glyphs[ag[aa]]||ab.missingGlyph;if(!B){continue}e+=D=Number(B.w||ab.w)+U}L.push(e);e=Math.max(z,e);var m=[];for(var aa=L.length;aa--;){m[aa]=e-L[aa]}if(D===null){return null}V+=(H.width-D);C+=H.minX;var v,p;if(n){v=J;p=J.firstChild}else{v=fabric.document.createElement("span");v.className="cufon cufon-canvas";v.alt=E;p=fabric.document.createElement("canvas");v.appendChild(p);if(A.printable){var Y=fabric.document.createElement("span");Y.className="cufon-alt";Y.appendChild(fabric.document.createTextNode(E));v.appendChild(Y)}}var ah=v.style;var O=p.style||{};var k=o.convert(H.height-I+T);var af=Math.ceil(k);var S=af/k;p.width=Math.ceil(o.convert(e+V-C)*S);p.height=af;I+=H.minY;O.top=Math.round(o.convert(I-ab.ascent))+"px";O.left=Math.round(o.convert(C))+"px";var j=Math.ceil(o.convert(e*S));var t=j+"px";var s=o.convert(ab.height);var F=(A.lineHeight-1)*o.convert(-ab.ascent/5)*(M-1);Cufon.textOptions.width=j;Cufon.textOptions.height=(s*M)+F;Cufon.textOptions.lines=M;Cufon.textOptions.totalLineHeight=F;if(a){ah.width=t;ah.height=s+"px"}else{ah.paddingLeft=t;ah.paddingBottom=(s-1)+"px"}var ad=Cufon.textOptions.context||p.getContext("2d"),K=af/H.height;Cufon.textOptions.fontAscent=ab.ascent*K;Cufon.textOptions.boundaries=null;for(var w=Cufon.textOptions.shadowOffsets,aa=R.length;aa--;){w[aa]=[R[aa][0]*K,R[aa][1]*K]}ad.save();ad.scale(K,K);ad.translate(-C-((1/K*p.width)/2)+(Cufon.fonts[ab.family].offsetLeft||0),-I-((Cufon.textOptions.height/K)/2)+(Cufon.fonts[ab.family].offsetTop||0));ad.lineWidth=ab.face["underline-thickness"];ad.save();function q(l,i){ad.strokeStyle=i;ad.beginPath();ad.moveTo(0,l);ad.lineTo(e,l);ad.stroke()}var r=Cufon.getTextDecoration(A),u=A.fontStyle==="italic";function ae(){ad.save();ad.fillStyle=A.backgroundColor;var aj=0,an=0,y=[{left:0}];if(A.textAlign==="right"){ad.translate(m[an],0);y[0].left=m[an]*K}else{if(A.textAlign==="center"){ad.translate(m[an]/2,0);y[0].left=m[an]/2*K}}for(var al=0,ak=ag.length;al.cufon-vml-canvas{text-indent:0}@media screen{cvml\\:shape,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute}.cufon-vml-canvas{position:absolute;text-align:left}.cufon-vml{display:inline-block;position:relative;vertical-align:middle}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none}.cufon-vml .cufon-alt{display:inline}}');function c(e,f){return a(e,/(?:em|ex|%)$/i.test(f)?"1em":f)}function a(h,i){if(/px$/i.test(i)){return parseFloat(i)}var g=h.style.left,f=h.runtimeStyle.left;h.runtimeStyle.left=h.currentStyle.left;h.style.left=i;var e=h.style.pixelLeft;h.style.left=g;h.runtimeStyle.left=f;return e}return function(T,z,O,w,D,U,M){var h=(z===null);if(h){z=D.alt}var B=T.viewBox;var j=O.computedFontSize||(O.computedFontSize=new Cufon.CSS.Size(c(U,O.get("fontSize"))+"px",T.baseSize));var L=O.computedLSpacing;if(L==undefined){L=O.get("letterSpacing");O.computedLSpacing=L=(L=="normal")?0:~~j.convertFrom(a(U,L))}var t,m;if(h){t=D;m=D.firstChild}else{t=fabric.document.createElement("span");t.className="cufon cufon-vml";t.alt=z;m=fabric.document.createElement("span");m.className="cufon-vml-canvas";t.appendChild(m);if(w.printable){var R=fabric.document.createElement("span");R.className="cufon-alt";R.appendChild(fabric.document.createTextNode(z));t.appendChild(R)}if(!M){t.appendChild(fabric.document.createElement("cvml:shape"))}}var Z=t.style;var G=m.style;var f=j.convert(B.height),W=Math.ceil(f);var K=W/f;var J=B.minX,I=B.minY;G.height=W;G.top=Math.round(j.convert(I-T.ascent));G.left=Math.round(j.convert(J));Z.height=j.convert(T.height)+"px";var p=Cufon.getTextDecoration(w);var y=O.get("color");var X=Cufon.CSS.textTransform(z,O).split("");var e=0,H=0,q=null;var x,r,A=w.textShadow;for(var S=0,Q=0,P=X.length;Sv?p:(o-n);s(t(y,m,w,p));if(o>v||q()){x.onComplete&&x.onComplete();return}k(r)})()}var f=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(m){fabric.window.setTimeout(m,1000/60)};var k=function(){return f.apply(fabric.window,arguments)};function b(n,p,o){if(n){var m=new Image();m.onload=function(){p&&p.call(o,m);m=m.onload=null};m.src=n}else{p&&p.call(o,n)}}function i(p,s){function o(t){return fabric[fabric.util.string.camelize(fabric.util.string.capitalize(t))]}function n(){if(++r===m){if(s){s(q)}}}var q=[],r=0,m=p.length;p.forEach(function(v,u){if(!v.type){return}var t=o(v.type);if(t.async){t.fromObject(v,function(w){q[u]=w;n()})}else{q[u]=t.fromObject(v);n()}})}function a(o,n,p){var m=o.length>1?new fabric.PathGroup(o,n):o[0];if(typeof p!=="undefined"){m.setSourcePath(p)}return m}fabric.util.removeFromArray=j;fabric.util.degreesToRadians=c;fabric.util.toFixed=e;fabric.util.getRandomInt=g;fabric.util.falseFunction=l;fabric.util.animate=d;fabric.util.requestAnimFrame=k;fabric.util.loadImage=b;fabric.util.enlivenObjects=i;fabric.util.groupSVGElements=a})();(function(){var d=Array.prototype.slice;if(!Array.prototype.indexOf){Array.prototype.indexOf=function(g){if(this===void 0||this===null){throw new TypeError()}var h=Object(this),e=h.length>>>0;if(e===0){return -1}var i=0;if(arguments.length>0){i=Number(arguments[1]);if(i!==i){i=0}else{if(i!==0&&i!==(1/0)&&i!==-(1/0)){i=(i>0||-1)*Math.floor(Math.abs(i))}}}if(i>=e){return -1}var f=i>=0?i:Math.max(e-Math.abs(i),0);for(;f>>0;f>>0;g>>0;f>>0;f>>0;g>>0,f=0,h;if(arguments.length>1){h=arguments[1]}else{do{if(f in this){h=this[f++];break}if(++f>=e){throw new TypeError()}}while(true)}for(;f=e){e=h[f][g]}}}else{while(f--){if(h[f]>=e){e=h[f]}}}return e}function c(h,g){if(!h||h.length===0){return undefined}var f=h.length-1,e=g?h[f][g]:h[f];if(g){while(f--){if(h[f][g]/g,">")}fabric.util.string={camelize:b,capitalize:c,escapeXml:a}}());(function(){var c=Array.prototype.slice,a=Function.prototype.apply,b=function(){};if(!Function.prototype.bind){Function.prototype.bind=function(d){var g=this,e=c.call(arguments,1),f;if(e.length){f=function(){return a.call(g,this instanceof b?this:d,e.concat(c.call(arguments)))}}else{f=function(){return a.call(g,this instanceof b?this:d,arguments)}}b.prototype=this.prototype;f.prototype=new b();return f}}})();(function(){var f=Array.prototype.slice,e=function(){};var c=(function(){for(var g in {toString:1}){if(g==="toString"){return false}}return true})();var b=function(g,j,h){for(var i in j){if(i in g.prototype&&typeof g.prototype[i]==="function"){g.prototype[i]=(function(k){return function(){var m=this.constructor.superclass;this.constructor.superclass=h;var l=j[k].apply(this,arguments);this.constructor.superclass=m;if(k!=="initialize"){return l}}})(i)}else{g.prototype[i]=j[i]}if(c){if(j.toString!==Object.prototype.toString){g.prototype.toString=j.toString}if(j.valueOf!==Object.prototype.valueOf){g.prototype.valueOf=j.valueOf}}}};function a(){}function d(){var k=null,j=f.call(arguments,0);if(typeof j[0]==="function"){k=j.shift()}function g(){this.initialize.apply(this,arguments)}g.superclass=k;g.subclasses=[];if(k){a.prototype=k.prototype;g.prototype=new a();k.subclasses.push(g)}for(var h=0,l=j.length;h-1?b(g,i.match(/opacity:\s*(\d?\.?\d*)/)[1]):g}for(var j in i){if(j==="opacity"){b(g,i[j])}else{var h=(j==="float"||j==="cssFloat")?(typeof k.styleFloat==="undefined"?"cssFloat":"styleFloat"):j;k[h]=i[j]}}return g}var f=fabric.document.createElement("div"),e=typeof f.style.opacity==="string",a=typeof f.style.filter==="string",c=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,b=function(g){return g};if(e){b=function(g,h){g.style.opacity=h;return g}}else{if(a){b=function(g,h){var i=g.style;if(g.currentStyle&&!g.currentStyle.hasLayout){i.zoom=1}if(c.test(i.filter)){h=h>=0.9999?"":("alpha(opacity="+(h*100)+")");i.filter=i.filter.replace(c,h)}else{i.filter+=" alpha(opacity="+(h*100)+")"}return g}}}fabric.util.setStyle=d})();(function(){var h=Array.prototype.slice;function g(j){return typeof j==="string"?fabric.document.getElementById(j):j}var b=function(j){return h.call(j,0)};var i;try{i=b(fabric.document.childNodes) instanceof Array}catch(a){}if(!i){b=function(k){var j=new Array(k.length),l=k.length;while(l--){j[l]=k[l]}return j}}function c(k,j){var l=fabric.document.createElement(k);for(var m in j){if(m==="class"){l.className=j[m]}else{if(m==="for"){l.htmlFor=j[m]}else{l.setAttribute(m,j[m])}}}return l}function f(j,k){if((" "+j.className+" ").indexOf(" "+k+" ")===-1){j.className+=(j.className?" ":"")+k}}function e(k,l,j){if(typeof l==="string"){l=c(l,j)}if(k.parentNode){k.parentNode.replaceChild(l,k)}l.appendChild(k);return l}function d(k){var j=0,l=0;do{j+=k.offsetTop||0;l+=k.offsetLeft||0;k=k.offsetParent}while(k);return({left:l,top:j})}(function(){var k=fabric.document.documentElement.style;var l="userSelect" in k?"userSelect":"MozUserSelect" in k?"MozUserSelect":"WebkitUserSelect" in k?"WebkitUserSelect":"KhtmlUserSelect" in k?"KhtmlUserSelect":"";function m(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=fabric.util.falseFunction}if(l){n.style[l]="none"}else{if(typeof n.unselectable==="string"){n.unselectable="on"}}return n}function j(n){if(typeof n.onselectstart!=="undefined"){n.onselectstart=null}if(l){n.style[l]=""}else{if(typeof n.unselectable==="string"){n.unselectable=""}}return n}fabric.util.makeElementUnselectable=m;fabric.util.makeElementSelectable=j})();(function(){function j(k,o){var m=fabric.document.getElementsByTagName("head")[0],l=fabric.document.createElement("script"),n=true;l.type="text/javascript";l.setAttribute("runat","server");l.onload=l.onreadystatechange=function(p){if(n){if(typeof this.readyState==="string"&&this.readyState!=="loaded"&&this.readyState!=="complete"){return}n=false;o(p||fabric.window.event);l=l.onload=l.onreadystatechange=null}};l.src=k;m.appendChild(l)}fabric.util.getScript=j})();fabric.util.getById=g;fabric.util.toArray=b;fabric.util.makeElement=c;fabric.util.addClass=f;fabric.util.wrapElement=e;fabric.util.getElementOffset=d})();(function(){function d(e,f){return e+(/\?/.test(e)?"&":"?")+f}var c=(function(){var h=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest()}];for(var e=h.length;e--;){try{var g=h[e]();if(g){return h[e]}}catch(f){}}})();function a(){}function b(g,f){f||(f={});var j=f.method?f.method.toUpperCase():"GET",h=f.onComplete||function(){},i=c(),e;i.onreadystatechange=function(){if(i.readyState===4){h(i);i.onreadystatechange=a}};if(j==="GET"){e=null;if(typeof f.parameters==="string"){g=d(g,f.parameters)}}i.open(j,g,true);if(j==="POST"||j==="PUT"){i.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}i.send(e);return i}fabric.util.request=b})();(function(){function d(F,E,H,G){return H*(F/=G)*F+E}function l(F,E,H,G){return -H*(F/=G)*(F-2)+E}function r(F,E,H,G){F/=(G/2);if(F<1){return H/2*F*F+E}return -H/2*((--F)*(F-2)-1)+E}function B(F,E,H,G){return H*(F/=G)*F*F+E}function q(F,E,H,G){return H*((F=F/G-1)*F*F+1)+E}function u(F,E,H,G){F/=G/2;if(F<1){return H/2*F*F*F+E}return H/2*((F-=2)*F*F+2)+E}function t(F,E,H,G){return H*(F/=G)*F*F*F+E}function g(F,E,H,G){return -H*((F=F/G-1)*F*F*F-1)+E}function k(F,E,H,G){F/=G/2;if(F<1){return H/2*F*F*F*F+E}return -H/2*((F-=2)*F*F*F-2)+E}function y(F,E,H,G){return H*(F/=G)*F*F*F*F+E}function j(F,E,H,G){return H*((F=F/G-1)*F*F*F*F+1)+E}function n(F,E,H,G){F/=G/2;if(F<1){return H/2*F*F*F*F*F+E}return H/2*((F-=2)*F*F*F*F+2)+E}function f(F,E,H,G){return -H*Math.cos(F/G*(Math.PI/2))+H+E}function o(F,E,H,G){return H*Math.sin(F/G*(Math.PI/2))+E}function v(F,E,H,G){return -H/2*(Math.cos(Math.PI*F/G)-1)+E}function D(F,E,H,G){return(F===0)?E:H*Math.pow(2,10*(F/G-1))+E}function c(F,E,H,G){return(F===G)?E+H:H*(-Math.pow(2,-10*F/G)+1)+E}function i(F,E,H,G){if(F===0){return E}if(F===G){return E+H}F/=G/2;if(F<1){return H/2*Math.pow(2,10*(F-1))+E}return H/2*(-Math.pow(2,-10*--F)+2)+E}function h(F,E,H,G){return -H*(Math.sqrt(1-(F/=G)*F)-1)+E}function p(F,E,H,G){return H*Math.sqrt(1-(F=F/G-1)*F)+E}function x(F,E,H,G){F/=G/2;if(F<1){return -H/2*(Math.sqrt(1-F*F)-1)+E}return H/2*(Math.sqrt(1-(F-=2)*F)+1)+E}function s(G,E,K,J){var H=1.70158;var I=0;var F=K;if(G===0){return E}G/=J;if(G===1){return E+K}if(!I){I=J*0.3}if(F-1;w=w.split(/\s+/);var u=[],v,t;if(y){v=0;t=w.length;for(;v/i,""))}if(!x.documentElement){return}h.parseSVGDocument(x.documentElement,function(A,z){k.set(u,{objects:h.util.array.invoke(A,"toObject"),options:z});w(A,z)},t)}}function b(v){var u=v.objects,t=v.options;u=u.map(function(w){return h[f(w.type)].fromObject(w)});return({objects:u,options:t})}function n(u,x,t){u=u.trim();var v;if(typeof DOMParser!=="undefined"){var w=new DOMParser();if(w&&w.parseFromString){v=w.parseFromString(u,"text/xml")}}else{if(h.window.ActiveXObject){v=new ActiveXObject("Microsoft.XMLDOM");v.async="false";v.loadXML(u.replace(//i,""))}}h.parseSVGDocument(v.documentElement,function(z,y){x(z,y)},t)}function m(w){var u="";for(var v=0,t=w.length;v",'",""].join("")}return u}p(h,{parseAttributes:e,parseElements:g,parseStyleAttribute:i,parsePointsAttribute:s,getCSSRules:d,loadSVGFromURL:c,loadSVGFromString:n,createSVGFontFacesMarkup:m})})(typeof exports!=="undefined"?exports:this);(function(){function c(h){var g=h.getAttribute("style");if(g){var k=g.split(/\s*;\s*/);if(k[k.length-1]===""){k.pop()}for(var f=k.length;f--;){var e=k[f].split(/\s*:\s*/),d=e[0].trim(),j=e[1].trim();if(d==="stop-color"){return j}}}}fabric.Gradient=fabric.util.createClass({initialize:function(d){d||(d={});this.x1=d.x1||0;this.y1=d.y1||0;this.x2=d.x2||0;this.y2=d.y2||0;this.colorStops=d.colorStops},toObject:function(){return{x1:this.x1,x2:this.x2,y1:this.y1,y2:this.y2,colorStops:this.colorStops}},toLiveGradient:function(e){var g=e.createLinearGradient(this.x1,this.y1,this.x2||e.canvas.width,this.y2);for(var d in this.colorStops){var f=this.colorStops[d];g.addColorStop(parseFloat(d),f)}return g}});fabric.util.object.extend(fabric.Gradient,{fromElement:function(g,d){var k=g.getElementsByTagName("stop"),j,e={},h={x1:g.getAttribute("x1")||0,y1:g.getAttribute("y1")||0,x2:g.getAttribute("x2")||"100%",y2:g.getAttribute("y2")||0};for(var f=k.length;f--;){g=k[f];j=g.getAttribute("offset");j=parseFloat(j)/(/%$/.test(j)?100:1);e[j]=c(g)||g.getAttribute("stop-color")}a(d,h);return new fabric.Gradient({x1:h.x1,y1:h.y1,x2:h.x2,y2:h.y2,colorStops:e})},forObject:function(e,d){d||(d={});a(e,d);return new fabric.Gradient(d)}});function a(f,e){for(var g in e){if(typeof e[g]==="string"&&/^\d+%$/.test(e[g])){var d=parseFloat(e[g],10);if(g==="x1"||g==="x2"){e[g]=f.width*d/100}else{if(g==="y1"||g==="y2"){e[g]=f.height*d/100}}}if(g==="x1"||g==="x2"){e[g]-=f.width/2}else{if(g==="y1"||g==="y2"){e[g]-=f.height/2}}}}function b(j){var f=j.getElementsByTagName("linearGradient"),d=j.getElementsByTagName("radialGradient"),g,e,h={};e=f.length;for(;e--;){g=f[e];h[g.getAttribute("id")]=g}e=d.length;for(;e--;){g=d[e];h[g.getAttribute("id")]=g}return h}fabric.getGradientDefs=b})();(function(b){var c=b.fabric||(b.fabric={});if(c.Point){c.warn("fabric.Point is already defined");return}c.Point=a;function a(d,e){if(arguments.length>0){this.init(d,e)}}a.prototype={constructor:a,init:function(d,e){this.x=d;this.y=e},add:function(d){return new a(this.x+d.x,this.y+d.y)},addEquals:function(d){this.x+=d.x;this.y+=d.y;return this},scalarAdd:function(d){return new a(this.x+d,this.y+d)},scalarAddEquals:function(d){this.x+=d;this.y+=d;return this},subtract:function(d){return new a(this.x-d.x,this.y-d.y)},subtractEquals:function(d){this.x-=d.x;this.y-=d.y;return this},scalarSubtract:function(d){return new a(this.x-d,this.y-d)},scalarSubtractEquals:function(d){this.x-=d;this.y-=d;return this},multiply:function(d){return new a(this.x*d,this.y*d)},multiplyEquals:function(d){this.x*=d;this.y*=d;return this},divide:function(d){return new a(this.x/d,this.y/d)},divideEquals:function(d){this.x/=d;this.y/=d;return this},eq:function(d){return(this.x===d.x&&this.y===d.y)},lt:function(d){return(this.xd.x&&this.y>d.y)},gte:function(d){return(this.x>=d.x&&this.y>=d.y)},lerp:function(e,d){return new a(this.x+(e.x-this.x)*d,this.y+(e.y-this.y)*d)},distanceFrom:function(f){var e=this.x-f.x,d=this.y-f.y;return Math.sqrt(e*e+d*d)},min:function(d){return new a(Math.min(this.x,d.x),Math.min(this.y,d.y))},max:function(d){return new a(Math.max(this.x,d.x),Math.max(this.y,d.y))},toString:function(){return this.x+","+this.y},setXY:function(d,e){this.x=d;this.y=e},setFromPoint:function(d){this.x=d.x;this.y=d.y},swap:function(e){var d=this.x,f=this.y;this.x=e.x;this.y=e.y;e.x=d;e.y=f}}})(typeof exports!=="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Intersection){b.warn("fabric.Intersection is already defined");return}function c(d){if(arguments.length>0){this.init(d)}}b.Intersection=c;b.Intersection.prototype={init:function(d){this.status=d;this.points=[]},appendPoint:function(d){this.points.push(d)},appendPoints:function(d){this.points=this.points.concat(d)}};b.Intersection.intersectLineLine=function(h,f,l,k){var m,i=(k.x-l.x)*(h.y-l.y)-(k.y-l.y)*(h.x-l.x),j=(f.x-h.x)*(h.y-l.y)-(f.y-h.y)*(h.x-l.x),g=(k.y-l.y)*(f.x-h.x)-(k.x-l.x)*(f.y-h.y);if(g!==0){var e=i/g,d=j/g;if(0<=e&&e<=1&&0<=d&&d<=1){m=new c("Intersection");m.points.push(new b.Point(h.x+e*(f.x-h.x),h.y+e*(f.y-h.y)))}else{m=new c("No Intersection")}}else{if(i===0||j===0){m=new c("Coincident")}else{m=new c("Parallel")}}return m};b.Intersection.intersectLinePolygon=function(e,d,l){var m=new c("No Intersection"),f=l.length;for(var h=0;h0){m.status="Intersection"}return m};b.Intersection.intersectPolygonPolygon=function(j,h){var f=new c("No Intersection"),l=j.length;for(var k=0;k0){f.status="Intersection"}return f};b.Intersection.intersectPolygonRectangle=function(n,e,d){var g=e.min(d),m=e.max(d),f=new b.Point(m.x,g.y),l=new b.Point(g.x,m.y),k=c.intersectLinePolygon(g,f,n),j=c.intersectLinePolygon(f,m,n),i=c.intersectLinePolygon(m,l,n),h=c.intersectLinePolygon(l,g,n),o=new c("No Intersection");o.appendPoints(k.points);o.appendPoints(j.points);o.appendPoints(i.points);o.appendPoints(h.points);if(o.points.length>0){o.status="Intersection"}return o}})(typeof exports!=="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Color){b.warn("fabric.Color is already defined.");return}function c(d){if(!d){this.setSource([0,0,0,1])}else{this._tryParsingColor(d)}}b.Color=c;b.Color.prototype={_tryParsingColor:function(d){var e=c.sourceFromHex(d);if(!e){e=c.sourceFromRgb(d)}if(e){this.setSource(e)}},getSource:function(){return this._source},setSource:function(d){this._source=d},toRgb:function(){var d=this.getSource();return"rgb("+d[0]+","+d[1]+","+d[2]+")"},toRgba:function(){var d=this.getSource();return"rgba("+d[0]+","+d[1]+","+d[2]+","+d[3]+")"},toHex:function(){var h=this.getSource();var f=h[0].toString(16);f=(f.length===1)?("0"+f):f;var e=h[1].toString(16);e=(e.length===1)?("0"+e):e;var d=h[2].toString(16);d=(d.length===1)?("0"+d):d;return f.toUpperCase()+e.toUpperCase()+d.toUpperCase()},getAlpha:function(){return this.getSource()[3]},setAlpha:function(e){var d=this.getSource();d[3]=e;this.setSource(d);return this},toGrayscale:function(){var f=this.getSource(),e=parseInt((f[0]*0.3+f[1]*0.59+f[2]*0.11).toFixed(0),10),d=f[3];this.setSource([e,e,e,d]);return this},toBlackWhite:function(d){var g=this.getSource(),f=(g[0]*0.3+g[1]*0.59+g[2]*0.11).toFixed(0),e=g[3];d=d||127;f=(Number(f)','',"',"Created with Fabric.js ",fabric.version,"",fabric.createSVGFontFacesMarkup(this.getObjects())];if(this.backgroundImage){g.push('')}for(var h=0,j=this.getObjects(),f=j.length;h");return g.join("")},isEmpty:function(){return this._objects.length===0},remove:function(f){d(this._objects,f);if(this.getActiveObject()===f){this.fire("before:selection:cleared",{target:f});this.discardActiveObject();this.fire("selection:cleared")}this.renderAll();return f},sendToBack:function(f){d(this._objects,f);this._objects.unshift(f);return this.renderAll()},bringToFront:function(f){d(this._objects,f);this._objects.push(f);return this.renderAll()},sendBackwards:function(h){var g=this._objects.indexOf(h),f=g;if(g!==0){for(var j=g-1;j>=0;--j){if(h.intersectsWithObject(this._objects[j])||h.isContainedWithinObject(this._objects[j])){f=j;break}}d(this._objects,h);this._objects.splice(f,0,h)}return this.renderAll()},bringForward:function(j){var m=this.getObjects(),g=m.indexOf(j),f=g;if(g!==m.length-1){for(var k=g+1,h=this._objects.length;k"};e(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',toGrayscale:function(k){var h=k.getContext("2d"),f=h.getImageData(0,0,k.width,k.height),o=f.data,l=f.width,q=f.height,p,g,n,m;for(n=0;n0){if(B>this.targetFindTolerance){B-=this.targetFindTolerance}else{B=0}if(A>this.targetFindTolerance){A-=this.targetFindTolerance}else{A=0}}var v=true;var r=w.getImageData(B,A,(this.targetFindTolerance*2)||1,(this.targetFindTolerance*2)||1);for(var u=3;u0)?0:-v),r.ey-((u>0)?0:-u),t,s);this.contextTop.lineWidth=this.selectionLineWidth;this.contextTop.strokeStyle=this.selectionBorderColor;this.contextTop.strokeRect(r.ex+a-((v>0)?0:t),r.ey+a-((u>0)?0:s),t,s)},_findSelectedObjects:function(v){var B=[],s=this._groupSelector.ex,A=this._groupSelector.ey,r=s+this._groupSelector.left,y=A+this._groupSelector.top,x,w=new fabric.Point(f(s,r),f(A,y)),z=new fabric.Point(l(s,r),l(A,y));for(var t=0,u=this._objects.length;t1){B=new fabric.Group(B);this.setActiveGroup(B);B.saveCoords();this.fire("selection:created",{target:B})}}this.renderAll()},findTarget:function(z,u){var A,r=this.getPointer(z);var t=this.getActiveGroup();if(t&&!u&&this.containsPoint(z,t)){A=t;return A}var s=[];for(var w=this._objects.length;w--;){if(this._objects[w]&&this.containsPoint(z,this._objects[w])){if(this.perPixelTargetFind||this._objects[w].perPixelTargetFind){s[s.length]=this._objects[w]}else{A=this._objects[w];this.relatedTarget=A;break}}}for(var v=0,y=s.length;v1)?p.apply(this,n.call(arguments,1)):p.call(this)},initialize:function(i){if(i){this.setOptions(i)}},_initGradient:function(i){if(i.fill&&typeof i.fill==="object"&&!(i.fill instanceof d.Gradient)){this.set("fill",new d.Gradient(i.fill))}},setOptions:function(p){var q=this.stateProperties.length,r;while(q--){r=this.stateProperties[q];if(r in p){this.set(r,p[r])}}this._initGradient(p)},transform:function(i){i.globalAlpha=this.opacity;i.translate(this.left,this.top);i.rotate(this._theta);i.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toObject:function(){var p=d.Object.NUM_FRACTION_DIGITS;var i={type:this.type,left:c(this.left,p),top:c(this.top,p),width:c(this.width,p),height:c(this.height,p),fill:(this.fill&&this.fill.toObject)?this.fill.toObject():this.fill,overlayFill:this.overlayFill,stroke:this.stroke,strokeWidth:this.strokeWidth,strokeDashArray:this.strokeDashArray,scaleX:c(this.scaleX,p),scaleY:c(this.scaleY,p),angle:c(this.getAngle(),p),flipX:this.flipX,flipY:this.flipY,opacity:c(this.opacity,p),selectable:this.selectable,hasControls:this.hasControls,hasBorders:this.hasBorders,hasRotatingPoint:this.hasRotatingPoint,transparentCorners:this.transparentCorners,perPixelTargetFind:this.perPixelTargetFind};if(!this.includeDefaultValues){i=this._removeDefaultValues(i)}return i},toDatalessObject:function(){return this.toObject()},getSvgStyles:function(){return["stroke: ",(this.stroke?this.stroke:"none"),"; ","stroke-width: ",(this.strokeWidth?this.strokeWidth:"0"),"; ","stroke-dasharray: ",(this.strokeDashArray?this.strokeDashArray.join(" "):"; "),"fill: ",(this.fill?this.fill:"none"),"; ","opacity: ",(this.opacity?this.opacity:"1"),";"].join("")},getSvgTransform:function(){var i=this.getAngle();return["translate(",c(this.left,2)," ",c(this.top,2),")",i!==0?(" rotate("+c(i,2)+")"):"",(this.scaleX===1&&this.scaleY===1)?"":(" scale("+c(this.scaleX,2)+" "+c(this.scaleY,2)+")")].join("")},_removeDefaultValues:function(p){var i=d.Object.prototype.options;if(i){this.stateProperties.forEach(function(q){if(p[q]===i[q]){delete p[q]}})}return p},isActive:function(){return !!this.active},setActive:function(i){this.active=!!i;return this},toString:function(){return"#"},set:function(i,p){if(typeof i==="object"){for(var q in i){this._set(q,i[q])}}else{if(typeof p==="function"){this._set(i,p(this.get(i)))}else{this._set(i,p)}}return this},_set:function(i,p){var q=(i==="scaleX"||i==="scaleY")&&p1?this.strokeWidth:0,A=this.padding;this.currentWidth=(this.width+y)*this.scaleX+A*2;this.currentHeight=(this.height+y)*this.scaleY+A*2;this._hypotenuse=Math.sqrt(Math.pow(this.currentWidth/2,2)+Math.pow(this.currentHeight/2,2));this._angle=Math.atan(this.currentHeight/this.currentWidth);var v=Math.cos(this._angle+this._theta)*this._hypotenuse,u=Math.sin(this._angle+this._theta)*this._hypotenuse,q=this._theta,z=Math.sin(q),x=Math.cos(q);var D={x:this.left-v,y:this.top-u};var w={x:D.x+(this.currentWidth*x),y:D.y+(this.currentWidth*z)};var C={x:w.x-(this.currentHeight*z),y:w.y+(this.currentHeight*x)};var r={x:D.x-(this.currentHeight*z),y:D.y+(this.currentHeight*x)};var t={x:D.x-(this.currentHeight/2*z),y:D.y+(this.currentHeight/2*x)};var i={x:D.x+(this.currentWidth/2*x),y:D.y+(this.currentWidth/2*z)};var p={x:w.x-(this.currentHeight/2*z),y:w.y+(this.currentHeight/2*x)};var B={x:r.x+(this.currentWidth/2*x),y:r.y+(this.currentWidth/2*z)};var s={x:D.x+(this.currentWidth/2*x),y:D.y+(this.currentWidth/2*z)};this.oCoords={tl:D,tr:w,br:C,bl:r,ml:t,mt:i,mr:p,mb:B,mtr:s};this._setCornerCoords();return this},getBoundingRectWidth:function(){this.oCoords||this.setCoords();var p=[this.oCoords.tl.x,this.oCoords.tr.x,this.oCoords.br.x,this.oCoords.bl.x];var i=d.util.array.min(p);var q=d.util.array.max(p);return Math.abs(i-q)},getBoundingRectHeight:function(){this.oCoords||this.setCoords();var i=[this.oCoords.tl.y,this.oCoords.tr.y,this.oCoords.br.y,this.oCoords.bl.y];var q=d.util.array.min(i);var p=d.util.array.max(i);return Math.abs(q-p)},drawBorders:function(y){if(!this.hasBorders){return}var r=d.Object.MIN_SCALE_LIMIT,t=this.padding,i=t*2,s=this.strokeWidth>1?this.strokeWidth:0;y.save();y.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;y.strokeStyle=this.borderColor;var x=1/(this.scaleXi){z=x-i}if(B){p+=(A*B)-(z*B||0)}else{w+=(A*y)-(z*y||0)}q[1&s?"moveTo":"lineTo"](p,w);if(s>=t){s=0}}}r(1,0);r(0,1);r(-1,0);r(0,-1);q.stroke();q.closePath();q.restore()},drawCorners:function(A){if(!this.hasControls){return}var w=this.cornersize,q=w/2,i=this.strokeWidth/2,p=-(this.width/2),u=-(this.height/2),G,B,y=w/this.scaleX,v=w/this.scaleY,D=this.padding/this.scaleX,C=this.padding/this.scaleY,E=q/this.scaleY,F=q/this.scaleX,s=(q-w)/this.scaleX,r=(q-w)/this.scaleY,x=this.height,z=this.width,t=this.transparentCorners?"strokeRect":"fillRect";A.save();A.lineWidth=1/Math.max(this.scaleX,this.scaleY);A.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1;A.strokeStyle=A.fillStyle=this.cornerColor;G=p-F-i-D;B=u-E-i-C;A.clearRect(G,B,y,v);A[t](G,B,y,v);G=p+z-F+i+D;B=u-E-i-C;A.clearRect(G,B,y,v);A[t](G,B,y,v);G=p-F-i-D;B=u+x+r+i+C;A.clearRect(G,B,y,v);A[t](G,B,y,v);G=p+z+s+i+D;B=u+x+r+i+C;A.clearRect(G,B,y,v);A[t](G,B,y,v);if(!this.lockUniScaling){G=p+z/2-F;B=u-E-i-C;A.clearRect(G,B,y,v);A[t](G,B,y,v);G=p+z/2-F;B=u+x+r+i+C;A.clearRect(G,B,y,v);A[t](G,B,y,v);G=p+z+s+i+D;B=u+x/2-E;A.clearRect(G,B,y,v);A[t](G,B,y,v);G=p-F-i-D;B=u+x/2-E;A.clearRect(G,B,y,v);A[t](G,B,y,v)}if(this.hasRotatingPoint){G=p+z/2-F;B=this.flipY?(u+x+(this.rotatingPointOffset/this.scaleY)-v/2+i+C):(u-(this.rotatingPointOffset/this.scaleY)-v/2-i-C);A.clearRect(G,B,y,v);A[t](G,B,y,v)}A.restore();return this},clone:function(i){if(this.constructor.fromObject){return this.constructor.fromObject(this.toObject(),i)}return new d.Object(this.toObject())},cloneAsImage:function(r){if(d.Image){var p=new Image();p.onload=function(){if(r){r(new d.Image(p),q)}p=p.onload=null};var q={angle:this.get("angle"),flipX:this.get("flipX"),flipY:this.get("flipY")};this.set("angle",0).set("flipX",false).set("flipY",false);this.toDataURL(function(i){p.src=i})}return this},toDataURL:function(r){var p=d.document.createElement("canvas");if(!p.getContext&&typeof G_vmlCanvasManager!=="undefined"){G_vmlCanvasManager.initElement(p)}p.width=this.getBoundingRectWidth();p.height=this.getBoundingRectHeight();d.util.wrapElement(p,"div");var i=new d.Canvas(p);i.backgroundColor="transparent";i.renderAll();if(this.constructor.async){this.clone(q)}else{q(this.clone())}function q(t){t.left=p.width/2;t.top=p.height/2;t.setActive(false);i.add(t);var s=i.toDataURL("png");i.dispose();i=t=null;r&&r(s)}},hasStateChanged:function(){return this.stateProperties.some(function(i){return this[i]!==this.originalState[i]},this)},saveState:function(){this.stateProperties.forEach(function(i){this.originalState[i]=this.get(i)},this);return this},setupState:function(){this.originalState={};this.saveState()},intersectsWithRect:function(q,s){var v=this.oCoords,i=new d.Point(v.tl.x,v.tl.y),r=new d.Point(v.tr.x,v.tr.y),u=new d.Point(v.bl.x,v.bl.y),p=new d.Point(v.br.x,v.br.y);var t=d.Intersection.intersectPolygonRectangle([i,r,p,u],q,s);return(t.status==="Intersection")},intersectsWithObject:function(i){function p(t){return{tl:new d.Point(t.tl.x,t.tl.y),tr:new d.Point(t.tr.x,t.tr.y),bl:new d.Point(t.bl.x,t.bl.y),br:new d.Point(t.br.x,t.br.y)}}var q=p(this.oCoords),s=p(i.oCoords);var r=d.Intersection.intersectPolygonPolygon([q.tl,q.tr,q.br,q.bl],[s.tl,s.tr,s.br,s.bl]);return(r.status==="Intersection")},isContainedWithinObject:function(i){return this.isContainedWithinRect(i.oCoords.tl,i.oCoords.br)},isContainedWithinRect:function(p,r){var t=this.oCoords,i=new d.Point(t.tl.x,t.tl.y),q=new d.Point(t.tr.x,t.tr.y),s=new d.Point(t.bl.x,t.bl.y);return i.x>p.x&&q.xp.y&&s.y=u)&&(r.d.y>=u)){continue}if((r.o.x===r.d.x)&&(r.o.x>=v)){w=r.o.x;t=u}else{y=0;x=(r.d.y-r.o.y)/(r.d.x-r.o.x);q=u-y*v;p=r.o.y-x*r.o.x;w=-(q-p)/(y-x);t=q+y*w}if(w>=v){s+=1}if(s===2){break}}return s},_getImageLines:function(i){return{topline:{o:i.tl,d:i.tr},rightline:{o:i.tr,d:i.br},bottomline:{o:i.br,d:i.bl},leftline:{o:i.bl,d:i.tl}}},_setCornerCoords:function(){var t=this.oCoords,p=b(45-this.getAngle()),r=Math.sqrt(2*Math.pow(this.cornersize,2))/2,i=r*Math.cos(p),q=r*Math.sin(p),u=Math.sin(this._theta),s=Math.cos(this._theta);t.tl.corner={tl:{x:t.tl.x-q,y:t.tl.y-i},tr:{x:t.tl.x+i,y:t.tl.y-q},bl:{x:t.tl.x-i,y:t.tl.y+q},br:{x:t.tl.x+q,y:t.tl.y+i}};t.tr.corner={tl:{x:t.tr.x-q,y:t.tr.y-i},tr:{x:t.tr.x+i,y:t.tr.y-q},br:{x:t.tr.x+q,y:t.tr.y+i},bl:{x:t.tr.x-i,y:t.tr.y+q}};t.bl.corner={tl:{x:t.bl.x-q,y:t.bl.y-i},bl:{x:t.bl.x-i,y:t.bl.y+q},br:{x:t.bl.x+q,y:t.bl.y+i},tr:{x:t.bl.x+i,y:t.bl.y-q}};t.br.corner={tr:{x:t.br.x+i,y:t.br.y-q},bl:{x:t.br.x-i,y:t.br.y+q},br:{x:t.br.x+q,y:t.br.y+i},tl:{x:t.br.x-q,y:t.br.y-i}};t.ml.corner={tl:{x:t.ml.x-q,y:t.ml.y-i},tr:{x:t.ml.x+i,y:t.ml.y-q},bl:{x:t.ml.x-i,y:t.ml.y+q},br:{x:t.ml.x+q,y:t.ml.y+i}};t.mt.corner={tl:{x:t.mt.x-q,y:t.mt.y-i},tr:{x:t.mt.x+i,y:t.mt.y-q},bl:{x:t.mt.x-i,y:t.mt.y+q},br:{x:t.mt.x+q,y:t.mt.y+i}};t.mr.corner={tl:{x:t.mr.x-q,y:t.mr.y-i},tr:{x:t.mr.x+i,y:t.mr.y-q},bl:{x:t.mr.x-i,y:t.mr.y+q},br:{x:t.mr.x+q,y:t.mr.y+i}};t.mb.corner={tl:{x:t.mb.x-q,y:t.mb.y-i},tr:{x:t.mb.x+i,y:t.mb.y-q},bl:{x:t.mb.x-i,y:t.mb.y+q},br:{x:t.mb.x+q,y:t.mb.y+i}};t.mtr.corner={tl:{x:t.mtr.x-q+(u*this.rotatingPointOffset),y:t.mtr.y-i-(s*this.rotatingPointOffset)},tr:{x:t.mtr.x+i+(u*this.rotatingPointOffset),y:t.mtr.y-q-(s*this.rotatingPointOffset)},bl:{x:t.mtr.x-i+(u*this.rotatingPointOffset),y:t.mtr.y+q-(s*this.rotatingPointOffset)},br:{x:t.mtr.x+q+(u*this.rotatingPointOffset),y:t.mtr.y+i-(s*this.rotatingPointOffset)}}},toGrayscale:function(){var i=this.get("fill");if(i){this.set("overlayFill",new d.Color(i).toGrayscale().toRgb())}return this},complexity:function(){return 0},toJSON:function(){return this.toObject()},setGradientFill:function(i){this.set("fill",d.Gradient.forObject(this,i))},animate:function(){if(arguments[0]&&typeof arguments[0]==="object"){for(var i in arguments[0]){this._animate(i,arguments[0][i],arguments[1])}}else{this._animate.apply(this,arguments)}return this},_animate:function(p,r,i){var q=this;i||(i={});if(!("from" in i)){i.from=this.get(p)}if(/[+\-]/.test((r+"").charAt(0))){r=this.get(p)+parseFloat(r)}d.util.animate({startValue:i.from,endValue:r,byValue:i.by,easing:i.easing,duration:i.duration,onChange:function(s){q.set(p,s);i.onChange&&i.onChange()},onComplete:function(){q.setCoords();i.onComplete&&i.onComplete()}})},centerH:function(){this.canvas.centerObjectH(this);return this},centerV:function(){this.canvas.centerObjectV(this);return this},center:function(){return this.centerH().centerV()},remove:function(){return this.canvas.remove(this)},sendToBack:function(){this.canvas.sendToBack(this);return this},bringToFront:function(){this.canvas.bringToFront(this);return this},sendBackwards:function(){this.canvas.sendBackwards(this);return this},bringForward:function(){this.canvas.bringForward(this);return this}});d.Object.prototype.rotate=d.Object.prototype.setAngle;var j=d.Object.prototype;for(var g=j.stateProperties.length;g--;){var h=j.stateProperties[g],e=h.charAt(0).toUpperCase()+h.slice(1),f="set"+e,m="get"+e;if(!j[m]){j[m]=(function(i){return new Function('return this.get("'+i+'")')})(h)}if(!j[f]){j[f]=(function(i){return new Function("value",'return this.set("'+i+'", value)')})(h)}}l(d.Object.prototype,d.Observable);l(d.Object,{NUM_FRACTION_DIGITS:2,MIN_SCALE_LIMIT:0.1})})(typeof exports!=="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),d=c.util.object.extend,a={x1:1,x2:1,y1:1,y2:1};if(c.Line){c.warn("fabric.Line is already defined");return}c.Line=c.util.createClass(c.Object,{type:"line",initialize:function(f,e){if(!f){f=[0,0,0,0]}this.callSuper("initialize",e);this.set("x1",f[0]);this.set("y1",f[1]);this.set("x2",f[2]);this.set("y2",f[3]);this._setWidthHeight(e)},_setWidthHeight:function(e){e||(e={});this.set("width",(this.x2-this.x1)||1);this.set("height",(this.y2-this.y1)||1);this.set("left","left" in e?e.left:(this.x1+this.width/2));this.set("top","top" in e?e.top:(this.y1+this.height/2))},_set:function(e,f){this[e]=f;if(e in a){this._setWidthHeight()}return this},_render:function(e){e.beginPath();if(this.group){e.translate(-this.group.width/2+this.left,-this.group.height/2+this.top)}e.moveTo(this.width===1?0:(-this.width/2),this.height===1?0:(-this.height/2));e.lineTo(this.width===1?0:(this.width/2),this.height===1?0:(this.height/2));e.lineWidth=this.strokeWidth;var f=e.strokeStyle;e.strokeStyle=e.fillStyle;e.stroke();e.strokeStyle=f},complexity:function(){return 1},toObject:function(){return d(this.callSuper("toObject"),{x1:this.get("x1"),y1:this.get("y1"),x2:this.get("x2"),y2:this.get("y2")})},toSVG:function(){return[""].join("")}});c.Line.ATTRIBUTE_NAMES="x1 y1 x2 y2 stroke stroke-width transform".split(" ");c.Line.fromElement=function(f,e){var h=c.parseAttributes(f,c.Line.ATTRIBUTE_NAMES);var g=[h.x1||0,h.y1||0,h.x2||0,h.y2||0];return new c.Line(g,d(h,e))};c.Line.fromObject=function(e){var f=[e.x1,e.y1,e.x2,e.y2];return new c.Line(f,e)}})(typeof exports!=="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),d=Math.PI*2,e=b.util.object.extend;if(b.Circle){b.warn("fabric.Circle is already defined.");return}b.Circle=b.util.createClass(b.Object,{type:"circle",initialize:function(f){f=f||{};this.set("radius",f.radius||0);this.callSuper("initialize",f);var g=this.get("radius")*2;this.set("width",g).set("height",g)},toObject:function(){return e(this.callSuper("toObject"),{radius:this.get("radius")})},toSVG:function(){return('')},_render:function(f,g){f.beginPath();f.globalAlpha*=this.opacity;f.arc(g?this.left:0,g?this.top:0,this.radius,0,d,false);f.closePath();if(this.fill){f.fill()}if(this.stroke){f.stroke()}},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(f){this.radius=f;this.set("width",f*2).set("height",f*2)},complexity:function(){return 1}});b.Circle.ATTRIBUTE_NAMES="cx cy r fill fill-opacity opacity stroke stroke-width transform".split(" ");b.Circle.fromElement=function(g,f){f||(f={});var h=b.parseAttributes(g,b.Circle.ATTRIBUTE_NAMES);if(!c(h)){throw new Error("value of `r` attribute is required and can not be negative")}if("left" in h){h.left-=(f.width/2)||0}if("top" in h){h.top-=(f.height/2)||0}return new b.Circle(e(h,f))};function c(f){return(("radius" in f)&&(f.radius>0))}b.Circle.fromObject=function(f){return new b.Circle(f)}})(typeof exports!=="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={});if(b.Triangle){b.warn("fabric.Triangle is already defined");return}b.Triangle=b.util.createClass(b.Object,{type:"triangle",initialize:function(c){c=c||{};this.callSuper("initialize",c);this.set("width",c.width||100).set("height",c.height||100)},_render:function(c){var d=this.width/2,e=this.height/2;c.beginPath();c.moveTo(-d,e);c.lineTo(0,-e);c.lineTo(d,e);c.closePath();if(this.fill){c.fill()}if(this.stroke){c.stroke()}},complexity:function(){return 1},toSVG:function(){var c=this.width/2,d=this.height/2;var e=[-c+" "+d,"0 "+-d,c+" "+d].join(",");return''}});b.Triangle.fromObject=function(c){return new b.Triangle(c)}})(typeof exports!=="undefined"?exports:this);(function(a){var b=a.fabric||(a.fabric={}),c=Math.PI*2,d=b.util.object.extend;if(b.Ellipse){b.warn("fabric.Ellipse is already defined.");return}b.Ellipse=b.util.createClass(b.Object,{type:"ellipse",initialize:function(e){e=e||{};this.callSuper("initialize",e);this.set("rx",e.rx||0);this.set("ry",e.ry||0);this.set("width",this.get("rx")*2);this.set("height",this.get("ry")*2)},toObject:function(){return d(this.callSuper("toObject"),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(){return[""].join("")},render:function(e,f){if(this.rx===0||this.ry===0){return}return this.callSuper("render",e,f)},_render:function(e,f){e.beginPath();e.save();e.globalAlpha*=this.opacity;if(this.transformMatrix&&this.group){e.translate(this.cx,this.cy)}e.transform(1,0,0,this.ry/this.rx,0,0);e.arc(f?this.left:0,f?this.top:0,this.rx,0,c,false);if(this.stroke){e.stroke()}if(this.fill){e.fill()}e.restore()},complexity:function(){return 1}});b.Ellipse.ATTRIBUTE_NAMES="cx cy rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");b.Ellipse.fromElement=function(g,f){f||(f={});var i=b.parseAttributes(g,b.Ellipse.ATTRIBUTE_NAMES);var e=i.left;var j=i.top;if("left" in i){i.left-=(f.width/2)||0}if("top" in i){i.top-=(f.height/2)||0}var h=new b.Ellipse(d(i,f));h.cx=e||0;h.cy=j||0;return h};b.Ellipse.fromObject=function(e){return new b.Ellipse(e)}})(typeof exports!=="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={});if(c.Rect){console.warn("fabric.Rect is already defined");return}c.Rect=c.util.createClass(c.Object,{type:"rect",rx:0,ry:0,initialize:function(d){this._initStateProperties();this.callSuper("initialize",d);this._initRxRy()},_initStateProperties:function(){this.stateProperties=this.stateProperties.concat(["rx","ry"])},_initRxRy:function(){if(this.rx&&!this.ry){this.ry=this.rx}else{if(this.ry&&!this.rx){this.rx=this.ry}}},_render:function(f){var j=this.rx||0,i=this.ry||0,d=-this.width/2,k=-this.height/2,e=this.width,g=this.height;f.beginPath();f.globalAlpha*=this.opacity;if(this.transformMatrix&&this.group){f.translate(this.width/2+this.x,this.height/2+this.y)}if(!this.transformMatrix&&this.group){f.translate(-this.group.width/2+this.width/2+this.x,-this.group.height/2+this.height/2+this.y)}f.moveTo(d+j,k);f.lineTo(d+e-j,k);f.quadraticCurveTo(d+e,k,d+e,k+i,d+e,k+i);f.lineTo(d+e,k+g-i);f.quadraticCurveTo(d+e,k+g,d+e-j,k+g,d+e-j,k+g);f.lineTo(d+j,k+g);f.quadraticCurveTo(d,k+g,d,k+g-i,d,k+g-i);f.lineTo(d,k+i);f.quadraticCurveTo(d,k,d+j,k,d+j,k);f.closePath();if(this.fill){f.fill()}if(this.strokeDashArray){this._renderDashedStroke(f)}else{if(this.stroke){f.stroke()}}},_normalizeLeftTopProperties:function(d){if(d.left){this.set("left",d.left+this.getWidth()/2)}this.set("x",d.left||0);if(d.top){this.set("top",d.top+this.getHeight()/2)}this.set("y",d.top||0);return this},complexity:function(){return 1},toObject:function(){return c.util.object.extend(this.callSuper("toObject"),{rx:this.get("rx")||0,ry:this.get("ry")||0})},toSVG:function(){return''}});c.Rect.ATTRIBUTE_NAMES="x y width height rx ry fill fill-opacity opacity stroke stroke-width transform".split(" ");function a(d){d.left=d.left||0;d.top=d.top||0;return d}c.Rect.fromElement=function(e,d){if(!e){return null}var g=c.parseAttributes(e,c.Rect.ATTRIBUTE_NAMES);g=a(g);var f=new c.Rect(c.util.object.extend((d?c.util.object.clone(d):{}),g));f._normalizeLeftTopProperties(g);return f};c.Rect.fromObject=function(d){return new c.Rect(d)}})(typeof exports!=="undefined"?exports:this);(function(b){var c=b.fabric||(b.fabric={}),a=c.util.toFixed;if(c.Polyline){c.warn("fabric.Polyline is already defined");return}c.Polyline=c.util.createClass(c.Object,{type:"polyline",initialize:function(e,d){d=d||{};this.set("points",e);this.callSuper("initialize",d);this._calcDimensions()},_calcDimensions:function(){return c.Polygon.prototype._calcDimensions.call(this)},toObject:function(){return c.Polygon.prototype.toObject.call(this)},toSVG:function(){var f=[];for(var e=0,d=this.points.length;e"].join("")},_render:function(f){var e;f.beginPath();f.moveTo(this.points[0].x,this.points[0].y);for(var g=0,d=this.points.length;g"].join("")},_render:function(j){var h;j.beginPath();j.moveTo(this.points[0].x,this.points[0].y);for(var k=0,g=this.points.length;k1){E=Math.sqrt(E);O*=E;N*=E}var R=aa/O;var Q=W/O;var D=(-W)/N;var C=(aa)/N;var H=R*M+Q*L;var q=D*M+C*L;var F=R*T+Q*S;var ab=D*T+C*S;var Z=(F-H)*(F-H)+(ab-q)*(ab-q);var U=1/Z-0.25;if(U<0){U=0}var w=Math.sqrt(U);if(P===J){w=-w}var V=0.5*(H+F)-w*(ab-q);var K=0.5*(q+ab)+w*(F-H);var v=Math.atan2(q-K,H-V);var u=Math.atan2(ab-K,F-V);var Y=u-v;if(Y<0&&P===1){Y+=2*Math.PI}else{if(Y>0&&P===0){Y-=2*Math.PI}}var B=Math.ceil(Math.abs(Y/(Math.PI*0.5+0.001)));var I=[];for(var X=0;X"},toObject:function(){var q=g(this.callSuper("toObject"),{path:this.path});if(this.sourcePath){q.sourcePath=this.sourcePath}if(this.transformMatrix){q.transformMatrix=this.transformMatrix}return q},toDatalessObject:function(){var q=this.toObject();if(this.sourcePath){q.path=this.sourcePath}delete q.sourcePath;return q},toSVG:function(){var t=[];for(var r=0,q=this.path.length;r',"',""].join("")},complexity:function(){return this.path.length},_parsePath:function(){var C=[],z,v,y;for(var u=0,q,w=this.path.length;uB){for(var r=1,x=q.length;r"];for(var l=0,j=m.length;l");return k.join("")},toString:function(){return"#"},isSameColor:function(){var i=this.getObjects()[0].get("fill");return this.getObjects().every(function(j){return j.get("fill")===i})},complexity:function(){return this.paths.reduce(function(i,j){return i+((j&&j.complexity)?j.complexity():0)},0)},toGrayscale:function(){var j=this.paths.length;while(j--){this.paths[j].toGrayscale()}return this},getObjects:function(){return this.paths}});function d(m){for(var l=0,j=m.length;l"},getObjects:function(){return this.objects},addWithUpdate:function(h){this._restoreObjectsState();this.objects.push(h);this._calcBounds();this._updateObjectsCoords();return this},removeWithUpdate:function(h){this._restoreObjectsState();f(this.objects,h);h.setActive(false);this._calcBounds();this._updateObjectsCoords();return this},add:function(h){this.objects.push(h);return this},remove:function(h){f(this.objects,h);return this},size:function(){return this.getObjects().length},_set:function(j,k){if(j==="fill"||j==="opacity"){var h=this.objects.length;this[j]=k;while(h--){this.objects[h].set(j,k)}}else{this[j]=k}},contains:function(h){return this.objects.indexOf(h)>-1},toObject:function(){return g(this.callSuper("toObject"),{objects:b(this.objects,"toObject")})},render:function(j,o){j.save();this.transform(j);var n=Math.max(this.scaleX,this.scaleY);for(var l=0,h=this.objects.length;li.x&&j-hi.y},toGrayscale:function(){var h=this.objects.length;while(h--){this.objects[h].toGrayscale()}},toSVG:function(){var k=[];for(var j=0,h=this.objects.length;j'+k.join("")+"")}});e.Group.fromObject=function(h,i){e.util.enlivenObjects(h.objects,function(j){delete h.objects;i&&i(new e.Group(j,h))})};e.Group.async=true})(typeof exports!=="undefined"?exports:this);(function(a){var b=fabric.util.object.extend;if(!a.fabric){a.fabric={}}if(a.fabric.Image){fabric.warn("fabric.Image is already defined.");return}if(!fabric.Object){fabric.warn("fabric.Object is required for fabric.Image initialization");return}fabric.Image=fabric.util.createClass(fabric.Object,{active:false,bordervisibility:false,cornervisibility:false,type:"image",initialize:function(d,c){c||(c={});this.callSuper("initialize",c);this._initElement(d);this._originalImage=this.getElement();this._initConfig(c);this.filters=[];if(c.filters){this.filters=c.filters;this.applyFilters()}},getElement:function(){return this._element},setElement:function(c){this._element=c;this._initConfig();return this},getOriginalSize:function(){var c=this.getElement();return{width:c.width,height:c.height}},setBorderVisibility:function(){this._resetWidthHeight();this._adjustWidthHeightToBorders();this.setCoords()},setCornersVisibility:function(c){this.cornervisibility=!!c},render:function(d,e){d.save();var c=this.transformMatrix;this._resetWidthHeight();if(this.group){d.translate(-this.group.width/2+this.width/2,-this.group.height/2+this.height/2)}if(c){d.transform(c[0],c[1],c[2],c[3],c[4],c[5])}if(!e){this.transform(d)}this._render(d);if(this.active&&!e){this.drawBorders(d);this.hideCorners||this.drawCorners(d)}d.restore()},toObject:function(){return b(this.callSuper("toObject"),{src:this._originalImage.src||this._originalImage._src,filters:this.filters.concat()})},toSVG:function(){return''},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(c){this.constructor.fromObject(this.toObject(),c)},applyFilters:function(i){if(this.filters.length===0){this.setElement(this._originalImage);i&&i();return}var c=typeof Buffer!=="undefined"&&typeof window==="undefined",g=this._originalImage,e=fabric.document.createElement("canvas"),f=c?new (require("canvas").Image)():fabric.document.createElement("img"),h=this;if(!e.getContext&&typeof G_vmlCanvasManager!=="undefined"){G_vmlCanvasManager.initElement(e)}e.width=g.width;e.height=g.height;e.getContext("2d").drawImage(g,0,0,g.width,g.height);this.filters.forEach(function(j){j&&j.applyTo(e)});f.onload=function(){h._element=f;i&&i();f.onload=e=g=null};f.width=g.width;f.height=g.height;if(c){var d=e.toDataURL("image/png").replace(/data:image\/png;base64,/,"");f.src=new Buffer(d,"base64");h._element=f;i&&i()}else{f.src=e.toDataURL("image/png")}return this},_render:function(c){c.drawImage(this.getElement(),-this.width/2,-this.height/2,this.width,this.height)},_adjustWidthHeightToBorders:function(c){if(c){this.currentBorder=this.borderwidth;this.width+=(2*this.currentBorder);this.height+=(2*this.currentBorder)}else{this.currentBorder=0}},_resetWidthHeight:function(){var c=this.getElement();this.set("width",c.width);this.set("height",c.height)},_initElement:function(c){this.setElement(fabric.util.getById(c));fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(c){c||(c={});this.setOptions(c);this._setBorder();this._setWidthHeight(c)},_initFilters:function(c){if(c.filters&&c.filters.length){this.filters=c.filters.map(function(d){return d&&fabric.Image.filters[d.type].fromObject(d)})}},_setBorder:function(){if(this.bordervisibility){this.currentBorder=this.borderwidth}else{this.currentBorder=0}},_setWidthHeight:function(c){var d=2*this.currentBorder;this.width="width" in c?c.width:((this.getElement().width||0)+d);this.height="height" in c?c.height:((this.getElement().height||0)+d)},complexity:function(){return 1}});fabric.Image.CSS_CANVAS="canvas-img";fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc;fabric.Image.fromObject=function(d,f){var c=fabric.document.createElement("img"),e=d.src;if(d.width){c.width=d.width}if(d.height){c.height=d.height}c.onload=function(){fabric.Image.prototype._initFilters.call(d,d);var g=new fabric.Image(c,d);f&&f(g);c=c.onload=null};c.src=e};fabric.Image.fromURL=function(d,f,e){var c=fabric.document.createElement("img");c.onload=function(){if(f){f(new fabric.Image(c,e))}c=c.onload=null};c.src=d};fabric.Image.ATTRIBUTE_NAMES="x y width height fill fill-opacity opacity stroke stroke-width transform xlink:href".split(" ");fabric.Image.fromElement=function(d,f,c){c||(c={});var e=fabric.parseAttributes(d,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(e["xlink:href"],f,b(e,c))};fabric.Image.async=true})(typeof exports!=="undefined"?exports:this);fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var a=this.get("angle");if(a>-225&&a<=-135){return -180}else{if(a>-135&&a<=-45){return -90}else{if(a>-45&&a<=45){return 0}else{if(a>45&&a<=135){return 90}else{if(a>135&&a<=225){return 180}else{if(a>225&&a<=315){return 270}else{if(a>315){return 360}}}}}}}return 0},straighten:function(){var a=this._getAngleValueForStraighten();this.setAngle(a);return this},fxStraighten:function(b){b=b||{};var c=function(){},d=b.onComplete||c,a=b.onChange||c,e=this;fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(f){e.setAngle(f);a()},onComplete:function(){e.setCoords();d()},onStart:function(){e.setActive(false)}});return this}});fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(a){a.straighten();this.renderAll();return this},fxStraightenObject:function(a){a.fxStraighten({onChange:this.renderAll.bind(this)});return this}});fabric.Image.filters={};fabric.Image.filters.Grayscale=fabric.util.createClass({type:"Grayscale",applyTo:function(d){var c=d.getContext("2d"),a=c.getImageData(0,0,d.width,d.height),h=a.data,e=a.width,l=a.height,k,b,g,f;for(g=0;gh&&m>h&&o>h&&p(a-m)0){h[j]=k;h[j+1]=c;h[j+2]=g}}d.putImageData(b,0,0)},toJSON:function(){return{type:this.type,color:this.color}}});fabric.Image.filters.Tint.fromObject=function(a){return new fabric.Image.filters.Tint(a)};(function(b){var c=b.fabric||(b.fabric={}),e=c.util.object.extend,d=c.util.object.clone,a=c.util.toFixed;if(c.Text){c.warn("fabric.Text is already defined");return}if(!c.Object){c.warn("fabric.Text requires fabric.Object");return}c.Text=c.util.createClass(c.Object,{fontSize:40,fontWeight:100,fontFamily:"Times New Roman",textDecoration:"",textShadow:"",textAlign:"left",fontStyle:"",lineHeight:1.3,strokeStyle:"",strokeWidth:1,backgroundColor:"",path:null,type:"text",useNative:true,initialize:function(g,f){this._initStateProperties();this.text=g;this.setOptions(f||{});this._theta=this.angle*Math.PI/180;this._initDimensions();this.setCoords()},_initDimensions:function(){var f=c.document.createElement("canvas");if(!f.getContext&&typeof G_vmlCanvasManager!=="undefined"){G_vmlCanvasManager.initElement(f)}this._render(f.getContext("2d"))},_initStateProperties:function(){this.stateProperties=this.stateProperties.concat();this.stateProperties.push("fontFamily","fontWeight","fontSize","path","text","textDecoration","textShadow","textAlign","fontStyle","lineHeight","strokeStyle","strokeWidth","backgroundColor","useNative");c.util.removeFromArray(this.stateProperties,"width")},toString:function(){return"#'},_render:function(f){if(typeof Cufon==="undefined"||this.useNative===true){this._renderViaNative(f)}else{this._renderViaCufon(f)}},_renderViaCufon:function(f){var h=Cufon.textOptions||(Cufon.textOptions={});h.left=this.left;h.top=this.top;h.context=f;h.color=this.fill;var g=this._initDummyElementForCufon();this.transform(f);Cufon.replaceElement(g,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor});this.width=h.width;this.height=h.height;this._totalLineHeight=h.totalLineHeight;this._fontAscent=h.fontAscent;this._boundaries=h.boundaries;this._shadowOffsets=h.shadowOffsets;this._shadows=h.shadows||[];g=null;this.setCoords()},_renderViaNative:function(f){this.transform(f);this._setTextStyles(f);var g=this.text.split(/\r?\n/);this.width=this._getTextWidth(f,g);this.height=this._getTextHeight(f,g);this._renderTextBackground(f,g);if(this.textAlign!=="left"){f.save();f.translate(this.textAlign==="center"?(this.width/2):this.width,0)}this._setTextShadow(f);this._renderTextFill(f,g);this.textShadow&&f.restore();this._renderTextStroke(f,g);if(this.textAlign!=="left"){f.restore()}this._renderTextDecoration(f,g);this._setBoundaries(f,g);this._totalLineHeight=0;this.setCoords()},_setBoundaries:function(h,k){this._boundaries=[];for(var j=0,g=k.length;jk){k=l}}return k},_setTextShadow:function(f){if(this.textShadow){var j=/\s+(-?\d+)(?:px)?\s+(-?\d+)(?:px)?\s+(\d+)(?:px)?\s*/;var g=this.textShadow;var i=j.exec(this.textShadow);var h=g.replace(j,"");f.save();f.shadowColor=h;f.shadowOffsetX=parseInt(i[1],10);f.shadowOffsetY=parseInt(i[2],10);f.shadowBlur=parseInt(i[3],10);this._shadows=[{blur:f.shadowBlur,color:f.shadowColor,offX:f.shadowOffsetX,offY:f.shadowOffsetY}];this._shadowOffsets=[[parseInt(f.shadowOffsetX,10),parseInt(f.shadowOffsetY,10)]]}},_renderTextFill:function(g,j){this._boundaries=[];for(var h=0,f=j.length;h-1){f(this.fontSize)}if(this.textDecoration.indexOf("line-through")>-1){f(this.fontSize/2)}if(this.textDecoration.indexOf("overline")>-1){f(0)}},_getFontDeclaration:function(){return[this.fontStyle,this.fontWeight,this.fontSize+"px",(c.isLikelyNode?('"'+this.fontFamily+'"'):this.fontFamily)].join(" ")},_initDummyElementForCufon:function(){var g=c.document.createElement("pre"),f=c.document.createElement("div");f.appendChild(g);if(typeof G_vmlCanvasManager==="undefined"){g.innerHTML=this.text}else{g.innerText=this.text.replace(/\r?\n/gi,"\r")}g.style.fontSize=this.fontSize+"px";g.style.letterSpacing="normal";return g},render:function(f,g){f.save();this._render(f);if(!g&&this.active){this.drawBorders(f);this.hideCorners||this.drawCorners(f)}f.restore()},toObject:function(){return e(this.callSuper("toObject"),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,path:this.path,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor,useNative:this.useNative})},toSVG:function(){var i=this.text.split(/\r?\n/),j=this.useNative?this.fontSize*this.lineHeight:(-this._fontAscent-((this._fontAscent/5)*this.lineHeight)),g=-(this.width/2),f=this.useNative?this.fontSize-1:(this.height/2)-(i.length*this.fontSize)-this._totalLineHeight,h=this._getSVGTextAndBg(j,g,i),k=this._getSVGShadows(j,i);f+=(this._fontAscent?((this._fontAscent/5)*this.lineHeight):0);return['',h.textBgRects.join(""),"',k.join(""),h.textSpans.join(""),"",""].join("")},_getSVGShadows:function(h,n){var o=[],k,l,p,g,f=1;if(!this._shadows||!this._boundaries){return o}for(k=0,p=this._shadows.length;k",c.util.string.escapeXml(n[l]),"");f=1}else{f++}}}return o},_getSVGTextAndBg:function(j,h,n){var g=[],k=[],l,m,o,f=1;for(l=0,o=n.length;l",c.util.string.escapeXml(n[l]),"");f=1}else{f++}if(!this.backgroundColor||!this._boundaries){continue}k.push("')}return{textSpans:g,textBgRects:k}},_getFillAttributes:function(f){var g=f?new c.Color(f):"";if(!g||!g.getSource()||g.getAlpha()===1){return'fill="'+f+'"'}return'opacity="'+g.getAlpha()+'" fill="'+g.setAlpha(1).toRgb()+'"'},setColor:function(f){this.set("fill",f);return this},setFontsize:function(f){this.set("fontSize",f);this._initDimensions();this.setCoords();return this},getText:function(){return this.text},setText:function(f){this.set("text",f);this._initDimensions();this.setCoords();return this},_set:function(f,g){if(f==="fontFamily"&&this.path){this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+g+"$3")}this.callSuper("_set",f,g)}});c.Text.ATTRIBUTE_NAMES=("x y fill fill-opacity opacity stroke stroke-width transform font-family font-style font-weight font-size text-decoration").split(" ");c.Text.fromObject=function(f){return new c.Text(f.text,d(f))};c.Text.fromElement=function(g,f){if(!g){return null}var h=c.parseAttributes(g,c.Text.ATTRIBUTE_NAMES);f=c.util.object.extend((f?c.util.object.clone(f):{}),h);var i=new c.Text(g.textContent,f);return i}})(typeof exports!=="undefined"?exports:this);(function(){if(typeof document!=="undefined"&&typeof window!=="undefined"){return}var DOMParser=new require("xmldom").DOMParser,URL=require("url"),HTTP=require("http"),Canvas=require("canvas"),Image=require("canvas").Image;function request(url,encoding,callback){var oURL=URL.parse(url),client=HTTP.createClient(oURL.port,oURL.hostname),req=client.request("GET",oURL.pathname,{host:oURL.hostname});client.addListener("error",function(err){if(err.errno===process.ECONNREFUSED){fabric.log("ECONNREFUSED: connection refused to "+client.host+":"+client.port)}else{fabric.log(err.message)}});req.end();req.on("response",function(response){var body="";if(encoding){response.setEncoding(encoding)}response.on("end",function(){callback(body)});response.on("data",function(chunk){if(response.statusCode===200){body+=chunk}})})}fabric.util.loadImage=function(url,callback){request(url,"binary",function(body){var img=new Image();img.src=new Buffer(body,"binary");img._src=url;callback(img)})};fabric.loadSVGFromURL=function(url,callback){url=url.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim();request(url,"",function(body){fabric.loadSVGFromString(body,callback)})};fabric.loadSVGFromString=function(string,callback){var doc=new DOMParser().parseFromString(string);fabric.parseSVGDocument(doc.documentElement,function(results,options){callback(results,options)})};fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body);callback&&callback()})};fabric.Image.fromObject=function(object,callback){fabric.util.loadImage(object.src,function(img){var oImg=new fabric.Image(img);oImg._initConfig(object);oImg._initFilters(object);callback(oImg)})};fabric.createCanvasForNode=function(width,height){var canvasEl=fabric.document.createElement("canvas"),nodeCanvas=new Canvas(width||600,height||600);canvasEl.style={};canvasEl.width=nodeCanvas.width;canvasEl.height=nodeCanvas.height;var FabricCanvas=fabric.Canvas||fabric.StaticCanvas;var fabricCanvas=new FabricCanvas(canvasEl);fabricCanvas.contextContainer=nodeCanvas.getContext("2d");fabricCanvas.nodeCanvas=nodeCanvas;return fabricCanvas};fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(width){origSetWidth.call(this);this.nodeCanvas.width=width;return this};if(fabric.Canvas){fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth}var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(height){origSetHeight.call(this);this.nodeCanvas.height=height;return this};if(fabric.Canvas){fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight}})(); \ No newline at end of file diff --git a/dist/all.min.js.gz b/dist/all.min.js.gz index 165319fc6ef0454af86ff7de531fb4402ff3a203..a46582abbedbc1d1f819ef231598c8562514a1d9 100644 GIT binary patch literal 42880 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 A`v3p{ literal 42966 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", "keywords": ["canvas", "graphic", "graphics", "SVG", "node-canvas", "parser", "HTML5", "object model"], "repository": "git://github.com/kangax/fabric.js", @@ -19,7 +19,8 @@ "xmldom": ">=0.1.7" }, "devDependencies": { - "qunit": "0.5.x" + "qunit": "0.5.x", + "jshint": "0.9.x" }, "engines": { "node": ">=0.4.0 && <0.9.0" }, "main": "./dist/all.js" diff --git a/src/canvas.class.js b/src/canvas.class.js index 7c324083..ca9ca152 100644 --- a/src/canvas.class.js +++ b/src/canvas.class.js @@ -46,7 +46,7 @@ function ProtoProxy(){ } ProtoProxy.prototype = fabric.StaticCanvas.prototype; - fabric.Canvas.prototype = new ProtoProxy; + fabric.Canvas.prototype = new ProtoProxy(); var InteractiveMethods = /** @scope fabric.Canvas.prototype */ { @@ -189,7 +189,7 @@ _this.__onMouseMove(e); }; - this._onResize = function (e) { + this._onResize = function () { _this.calcOffset(); }; @@ -216,6 +216,8 @@ */ __onMouseUp: function (e) { + var target; + if (this.isDrawingMode && this._isCurrentlyDrawing) { this._finalizeDrawingPath(); this.fire('mouse:up', { e: e }); @@ -224,9 +226,9 @@ if (this._currentTransform) { - var transform = this._currentTransform, - target = transform.target; + var transform = this._currentTransform; + target = transform.target; if (target._scaling) { target._scaling = false; } @@ -273,7 +275,7 @@ }, 50); this.fire('mouse:up', { target: target, e: e }); - target && target.fire('mouseup', { e: e }) + target && target.fire('mouseup', { e: e }); }, /** @@ -288,7 +290,7 @@ __onMouseDown: function (e) { // accept only left clicks - var isLeftClick = 'which' in e ? e.which == 1 : e.button == 1; + var isLeftClick = 'which' in e ? e.which === 1 : e.button === 1; if (!isLeftClick && !fabric.isTouchSupported) return; if (this.isDrawingMode) { @@ -324,7 +326,7 @@ // rotate and scale will happen at the same time this.stateful && target.saveState(); - if (corner = target._findTargetCorner(e, this._offset)) { + if ((corner = target._findTargetCorner(e, this._offset))) { this.onBeforeScaleRotate(target); } @@ -360,6 +362,8 @@ */ __onMouseMove: function (e) { + var target; + if (this.isDrawingMode) { if (this._isCurrentlyDrawing) { this._captureDrawingPath(e); @@ -368,11 +372,12 @@ return; } - var groupSelector = this._groupSelector; + var groupSelector = this._groupSelector, pointer; // We initially clicked in an empty area, so we draw a box for multiple selection. if (groupSelector !== null) { - var pointer = getPointer(e); + pointer = getPointer(e); + groupSelector.left = pointer.x - this._offset.left - groupSelector.ex; groupSelector.top = pointer.y - this._offset.top - groupSelector.ey; this.renderTop(); @@ -386,7 +391,7 @@ // what part of the pictures we are hovering to change the caret symbol. // We won't do that while dragging or rotating in order to improve the // performance. - var target = this.findTarget(e); + target = this.findTarget(e); if (!target) { // image/text was hovered-out from, we remove its borders @@ -408,8 +413,9 @@ } else { // object is being transformed (scaled/rotated/moved/etc.) - var pointer = getPointer(e), - x = pointer.x, + pointer = getPointer(e); + + var x = pointer.x, y = pointer.y; this._currentTransform.target.isMoving = true; @@ -596,7 +602,7 @@ corner, pointer = getPointer(e); - if (corner = target._findTargetCorner(e, this._offset)) { + if ((corner = target._findTargetCorner(e, this._offset))) { action = (corner === 'ml' || corner === 'mr') ? 'scaleX' : (corner === 'mt' || corner === 'mb') @@ -726,17 +732,14 @@ minY = utilMin(this._freeDrawingYPoints), maxX = utilMax(this._freeDrawingXPoints), maxY = utilMax(this._freeDrawingYPoints), - ctx = this.contextTop, path = [ ], - xPoint, - yPoint, xPoints = this._freeDrawingXPoints, yPoints = this._freeDrawingYPoints; path.push('M ', xPoints[0] - minX, ' ', yPoints[0] - minY, ' '); - for (var i = 1; xPoint = xPoints[i], yPoint = yPoints[i]; i++) { - path.push('L ', xPoint - minX, ' ', yPoint - minY, ' '); + for (var i = 1, len = xPoints.length; i < len; i++) { + path.push('L ', xPoints[i] - minX, ' ', yPoints[i] - minY, ' '); } // TODO (kangax): maybe remove Path creation from here, to decouple fabric.Canvas from fabric.Path, @@ -901,9 +904,7 @@ }, _findSelectedObjects: function (e) { - var target, - targetRegion, - group = [ ], + var group = [ ], x1 = this._groupSelector.ex, y1 = this._groupSelector.ey, x2 = x1 + this._groupSelector.left, @@ -932,7 +933,7 @@ this.setActiveObject(group[0], e); } else if (group.length > 1) { - var group = new fabric.Group(group); + group = new fabric.Group(group); this.setActiveGroup(group); group.saveCoords(); this.fire('selection:created', { target: group }); @@ -975,11 +976,11 @@ } } } - for (var i = 0, len = possibleTargets.length; i < len; i++) { - var pointer = this.getPointer(e); - var isTransparent = this._isTargetTransparent(possibleTargets[i], pointer.x, pointer.y); + for (var j = 0, len = possibleTargets.length; j < len; j++) { + pointer = this.getPointer(e); + var isTransparent = this._isTargetTransparent(possibleTargets[j], pointer.x, pointer.y); if (!isTransparent) { - target = possibleTargets[i]; + target = possibleTargets[j]; this.relatedTarget = target; break; } diff --git a/src/canvas.serialization.js b/src/canvas.serialization.js index f8d27962..2f5565ca 100644 --- a/src/canvas.serialization.js +++ b/src/canvas.serialization.js @@ -47,6 +47,86 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { } } + /** @ignore */ + function loadObject(obj, index) { + + var pathProp = obj.paths ? 'paths' : 'path'; + var path = obj[pathProp]; + + delete obj[pathProp]; + + if (typeof path !== 'string') { + if (obj.type === 'image') { + fabric[fabric.util.string.capitalize(obj.type)].fromObject(obj, function (o) { + onObjectLoaded(o, index); + }); + } + else { + var klass = fabric[fabric.util.string.camelize(fabric.util.string.capitalize(obj.type))]; + if (!klass || !klass.fromObject) return; + + // restore path + if (path) { + obj[pathProp] = path; + } + onObjectLoaded(klass.fromObject(obj), index); + } + } + else { + if (obj.type === 'image') { + fabric.util.loadImage(path, function (image) { + var oImg = new fabric.Image(image); + + oImg.setSourcePath(path); + + fabric.util.object.extend(oImg, obj); + oImg.setAngle(obj.angle); + + onObjectLoaded(oImg, index); + }); + } + else if (obj.type === 'text') { + + if (obj.useNative) { + onObjectLoaded(fabric.Text.fromObject(obj), index); + } + else { + obj.path = path; + var object = fabric.Text.fromObject(obj); + var onscriptload = function () { + // TODO (kangax): find out why Opera refuses to work without this timeout + if (Object.prototype.toString.call(fabric.window.opera) === '[object Opera]') { + setTimeout(function () { + onObjectLoaded(object, index); + }, 500); + } + else { + onObjectLoaded(object, index); + } + }; + + fabric.util.getScript(path, onscriptload); + } + } + else { + fabric.loadSVGFromURL(path, function (elements) { + var object = fabric.util.groupSVGElements(elements, obj, path); + + // copy parameters from serialied json to object (left, top, scaleX, scaleY, etc.) + // skip this step if an object is a PathGroup, since we already passed it options object before + if (!(object instanceof fabric.PathGroup)) { + fabric.util.object.extend(object, obj); + if (typeof obj.angle !== 'undefined') { + object.setAngle(obj.angle); + } + } + + onObjectLoaded(object, index); + }); + } + } + } + var _this = this, numLoadedObjects = 0, numTotalObjects = objects.length; @@ -56,86 +136,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, { } try { - objects.forEach(function (obj, index) { - - var pathProp = obj.paths ? 'paths' : 'path'; - var path = obj[pathProp]; - - delete obj[pathProp]; - - if (typeof path !== 'string') { - switch (obj.type) { - case 'image': - fabric[fabric.util.string.capitalize(obj.type)].fromObject(obj, function (o) { - onObjectLoaded(o, index); - }); - break; - default: - var klass = fabric[fabric.util.string.camelize(fabric.util.string.capitalize(obj.type))]; - if (klass && klass.fromObject) { - // restore path - if (path) { - obj[pathProp] = path; - } - onObjectLoaded(klass.fromObject(obj), index); - } - break; - } - } - else { - if (obj.type === 'image') { - fabric.util.loadImage(path, function (image) { - var oImg = new fabric.Image(image); - - oImg.setSourcePath(path); - - fabric.util.object.extend(oImg, obj); - oImg.setAngle(obj.angle); - - onObjectLoaded(oImg, index); - }); - } - else if (obj.type === 'text') { - - if (obj.useNative) { - onObjectLoaded(fabric.Text.fromObject(obj), index); - } - else { - obj.path = path; - var object = fabric.Text.fromObject(obj); - var onscriptload = function () { - // TODO (kangax): find out why Opera refuses to work without this timeout - if (Object.prototype.toString.call(fabric.window.opera) === '[object Opera]') { - setTimeout(function () { - onObjectLoaded(object, index); - }, 500); - } - else { - onObjectLoaded(object, index); - } - } - - fabric.util.getScript(path, onscriptload); - } - } - else { - fabric.loadSVGFromURL(path, function (elements, options) { - var object = fabric.util.groupSVGElements(elements, obj, path); - - // copy parameters from serialied json to object (left, top, scaleX, scaleY, etc.) - // skip this step if an object is a PathGroup, since we already passed it options object before - if (!(object instanceof fabric.PathGroup)) { - fabric.util.object.extend(object, obj); - if (typeof obj.angle !== 'undefined') { - object.setAngle(obj.angle); - } - } - - onObjectLoaded(object, index); - }); - } - } - }, this); + objects.forEach(loadObject, this); } catch(e) { fabric.log(e.message); diff --git a/src/circle.class.js b/src/circle.class.js index a1e09231..28c6419a 100644 --- a/src/circle.class.js +++ b/src/circle.class.js @@ -141,7 +141,7 @@ options || (options = { }); var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES); if (!isValidRadius(parsedAttributes)) { - throw Error('value of `r` attribute is required and can not be negative'); + throw new Error('value of `r` attribute is required and can not be negative'); } if ('left' in parsedAttributes) { parsedAttributes.left -= (options.width / 2) || 0; @@ -170,4 +170,4 @@ return new fabric.Circle(object); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/color.class.js b/src/color.class.js index f86609d4..8772c4bd 100644 --- a/src/color.class.js +++ b/src/color.class.js @@ -1,14 +1,14 @@ (function(global) { - + "use strict"; - + var fabric = global.fabric || (global.fabric = { }); - + if (fabric.Color) { fabric.warn('fabric.Color is already defined.'); return; } - + /** * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations; * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects. @@ -25,11 +25,11 @@ this._tryParsingColor(color); } } - + fabric.Color = Color; - + fabric.Color.prototype = /** @scope fabric.Color.prototype */ { - + /** * @private * @method _tryParsingColor @@ -91,19 +91,19 @@ var source = this.getSource(); var r = source[0].toString(16); - r = (r.length == 1) ? ('0' + r) : r; + r = (r.length === 1) ? ('0' + r) : r; var g = source[1].toString(16); - g = (g.length == 1) ? ('0' + g) : g; + g = (g.length === 1) ? ('0' + g) : g; var b = source[2].toString(16); - b = (b.length == 1) ? ('0' + b) : b; + b = (b.length === 1) ? ('0' + b) : b; return r.toUpperCase() + g.toUpperCase() + b.toUpperCase(); }, /** - * Gets value of alpha channel for this color + * Gets value of alpha channel for this color * @method getAlpha * @return {Number} 0-1 */ @@ -145,8 +145,9 @@ toBlackWhite: function(threshold) { var source = this.getSource(), average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), - currentAlpha = source[3], - threshold = threshold || 127; + currentAlpha = source[3]; + + threshold = threshold || 127; average = (Number(average) < Number(threshold)) ? 0 : 255; this.setSource([average, average, average, currentAlpha]); @@ -179,14 +180,14 @@ return this; } }; - + /** * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgb(255, 100, 10, 0.5), rgb(1,1,1)) * @static * @field */ fabric.Color.reRGBa = /^rgba?\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})(?:\s*,\s*(\d+(?:\.\d+)?))?\)$/; - + /** * Regex matching color in HEX format (ex: #FF5555, 010155, aff) * @static @@ -203,7 +204,7 @@ fabric.Color.fromRgb = function(color) { return Color.fromSource(Color.sourceFromRgb(color)); }; - + /** * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format * @method sourceFromRgb @@ -241,7 +242,7 @@ fabric.Color.fromHex = function(color) { return Color.fromSource(Color.sourceFromHex(color)); }; - + /** * Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in HEX format * @static @@ -265,7 +266,7 @@ ]; } }; - + /** * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5]) * @static @@ -278,4 +279,4 @@ return oColor; }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/ellipse.class.js b/src/ellipse.class.js index 26b70d84..07f25329 100644 --- a/src/ellipse.class.js +++ b/src/ellipse.class.js @@ -162,4 +162,4 @@ return new fabric.Ellipse(object); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/gradient.class.js b/src/gradient.class.js index fb3c9829..b1efa447 100644 --- a/src/gradient.class.js +++ b/src/gradient.class.js @@ -91,10 +91,8 @@ */ var colorStopEls = el.getElementsByTagName('stop'), - el, offset, colorStops = { }, - colorStopFromStyle, coords = { x1: el.getAttribute('x1') || 0, y1: el.getAttribute('y1') || 0, @@ -166,15 +164,17 @@ function getGradientDefs(doc) { var linearGradientEls = doc.getElementsByTagName('linearGradient'), radialGradientEls = doc.getElementsByTagName('radialGradient'), - el, + el, i, gradientDefs = { }; - for (var i = linearGradientEls.length; i--; ) { + i = linearGradientEls.length; + for (; i--; ) { el = linearGradientEls[i]; gradientDefs[el.getAttribute('id')] = el; } - for (var i = radialGradientEls.length; i--; ) { + i = radialGradientEls.length; + for (; i--; ) { el = radialGradientEls[i]; gradientDefs[el.getAttribute('id')] = el; } diff --git a/src/group.class.js b/src/group.class.js index 27b5d629..06930439 100644 --- a/src/group.class.js +++ b/src/group.class.js @@ -208,8 +208,11 @@ var groupScaleFactor = Math.max(this.scaleX, this.scaleY); - for (var i = 0, len = this.objects.length, object; object = this.objects[i]; i++) { + for (var i = 0, len = this.objects.length; i < len; i++) { + + var object = this.objects[i]; var originalScaleFactor = object.borderScaleFactor; + object.borderScaleFactor = groupScaleFactor; object.render(ctx); object.borderScaleFactor = originalScaleFactor; @@ -239,7 +242,7 @@ */ complexity: function() { return this.getObjects().reduce(function(total, object) { - total += (typeof object.complexity == 'function') ? object.complexity() : 0; + total += (typeof object.complexity === 'function') ? object.complexity() : 0; return total; }, 0); }, @@ -268,8 +271,6 @@ var groupLeft = this.get('left'), groupTop = this.get('top'), groupAngle = this.getAngle() * (Math.PI / 180), - objectLeft = object.get('originalLeft'), - objectTop = object.get('originalTop'), rotatedTop = Math.cos(groupAngle) * object.get('top') + Math.sin(groupAngle) * object.get('left'), rotatedLeft = -Math.sin(groupAngle) * object.get('top') + Math.cos(groupAngle) * object.get('left'); @@ -399,7 +400,7 @@ aX.push(o.oCoords[prop].x); aY.push(o.oCoords[prop].y); } - }; + } minX = min(aX); maxX = max(aX); @@ -481,4 +482,4 @@ fabric.Group.async = true; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/image.class.js b/src/image.class.js index 4eb72aaf..a441fd27 100644 --- a/src/image.class.js +++ b/src/image.class.js @@ -11,7 +11,7 @@ if (global.fabric.Image) { fabric.warn('fabric.Image is already defined.'); return; - }; + } if (!fabric.Object) { fabric.warn('fabric.Object is required for fabric.Image initialization'); @@ -109,9 +109,9 @@ * @method setBorderVisibility * @param {Boolean} visible When true, border is set to be visible */ - setBorderVisibility: function(visible) { + setBorderVisibility: function() { this._resetWidthHeight(); - this._adjustWidthHeightToBorders(showBorder); + this._adjustWidthHeightToBorders(); this.setCoords(); }, @@ -223,10 +223,10 @@ var isLikelyNode = typeof Buffer !== 'undefined' && typeof window === 'undefined', imgEl = this._originalImage, canvasEl = fabric.document.createElement('canvas'), - replacement = isLikelyNode ? new (require('canvas').Image) : fabric.document.createElement('img'), + replacement = isLikelyNode ? new (require('canvas').Image)() : fabric.document.createElement('img'), _this = this; - if (!canvasEl.getContext && typeof G_vmlCanvasManager != 'undefined') { + if (!canvasEl.getContext && typeof G_vmlCanvasManager !== 'undefined') { G_vmlCanvasManager.initElement(canvasEl); } @@ -456,4 +456,4 @@ fabric.Image.async = true; -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); diff --git a/src/image_filters.js b/src/image_filters.js index 15314877..ecf755e5 100644 --- a/src/image_filters.js +++ b/src/image_filters.js @@ -457,29 +457,29 @@ fabric.Image.filters.Tint = fabric.util.createClass( /** @scope fabric.Image.fil * @param {Object} canvasEl Canvas element to apply filter to */ applyTo: function(canvasEl) { - + var context = canvasEl.getContext('2d'), imageData = context.getImageData(0, 0, canvasEl.width, canvasEl.height), data = imageData.data, - iLen = data.length, i, - r, g, b, a; - - var rgb = parseInt(this.color).toString(16); - var cr = parseInt('0x'+rgb.substr(0, 2)); - var cg = parseInt('0x'+rgb.substr(2, 2)); - var cb = parseInt('0x'+rgb.substr(4, 2)); - + iLen = data.length, i, a; + + var rgb = parseInt(this.color, 10).toString(16); + + var cr = parseInt('0x' + rgb.substr(0, 2), 16); + var cg = parseInt('0x' + rgb.substr(2, 2), 16); + var cb = parseInt('0x' + rgb.substr(4, 2), 16); + for (i = 0; i < iLen; i+=4) { a = data[i+3]; - - if (a > 0){ + + if (a > 0){ data[i] = cr; data[i+1] = cg; - data[i+2] = cb; - } + data[i+2] = cb; + } } - + context.putImageData(imageData, 0, 0); }, diff --git a/src/intersection.class.js b/src/intersection.class.js index 61258a44..904ce85b 100644 --- a/src/intersection.class.js +++ b/src/intersection.class.js @@ -60,7 +60,7 @@ ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x), ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x), u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); - if (u_b != 0) { + if (u_b !== 0) { var ua = ua_t / u_b, ub = ub_t / u_b; if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { @@ -72,7 +72,7 @@ } } else { - if (ua_t == 0 || ub_t == 0) { + if (ua_t === 0 || ub_t === 0) { result = new Intersection("Coincident"); } else { @@ -146,4 +146,4 @@ return result; }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/line.class.js b/src/line.class.js index 96fce884..76dc4117 100644 --- a/src/line.class.js +++ b/src/line.class.js @@ -4,7 +4,6 @@ var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, - parentSet = fabric.Object.prototype.set, coordProps = { 'x1': 1, 'x2': 1, 'y1': 1, 'y2': 1 }; if (fabric.Line) { @@ -181,4 +180,4 @@ return new fabric.Line(points, object); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/node.js b/src/node.js index f3044f79..a2ced898 100644 --- a/src/node.js +++ b/src/node.js @@ -1,6 +1,6 @@ (function() { - if (typeof document != 'undefined' && typeof window != 'undefined') { + if (typeof document !== 'undefined' && typeof window !== 'undefined') { return; } @@ -14,7 +14,7 @@ function request(url, encoding, callback) { var oURL = URL.parse(url), client = HTTP.createClient(oURL.port, oURL.hostname), - request = client.request('GET', oURL.pathname, { 'host': oURL.hostname }); + req = client.request('GET', oURL.pathname, { 'host': oURL.hostname }); client.addListener('error', function(err) { if (err.errno === process.ECONNREFUSED) { @@ -25,8 +25,8 @@ } }); - request.end(); - request.on('response', function (response) { + req.end(); + req.on('response', function (response) { var body = ""; if (encoding) { response.setEncoding(encoding); @@ -35,7 +35,7 @@ callback(body); }); response.on('data', function (chunk) { - if (response.statusCode == 200) { + if (response.statusCode === 200) { body += chunk; } }); @@ -101,8 +101,8 @@ canvasEl.width = nodeCanvas.width; canvasEl.height = nodeCanvas.height; - var canvas = fabric.Canvas || fabric.StaticCanvas; - var fabricCanvas = new canvas(canvasEl); + var FabricCanvas = fabric.Canvas || fabric.StaticCanvas; + var fabricCanvas = new FabricCanvas(canvasEl); fabricCanvas.contextContainer = nodeCanvas.getContext('2d'); fabricCanvas.nodeCanvas = nodeCanvas; @@ -112,9 +112,6 @@ fabric.StaticCanvas.prototype.createPNGStream = function() { return this.nodeCanvas.createPNGStream(); }; - if (fabric.Canvas) { - fabric.Canvas.prototype.createPNGStream - } var origSetWidth = fabric.StaticCanvas.prototype.setWidth; fabric.StaticCanvas.prototype.setWidth = function(width) { diff --git a/src/object.class.js b/src/object.class.js index 52123751..99d22d75 100644 --- a/src/object.class.js +++ b/src/object.class.js @@ -4,7 +4,6 @@ var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, - clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, capitalize = fabric.util.string.capitalize, getPointer = fabric.util.getPointer, @@ -258,7 +257,7 @@ * @method initGradient */ _initGradient: function(options) { - if (options.fill && typeof options.fill == 'object' && !(options.fill instanceof fabric.Gradient)) { + if (options.fill && typeof options.fill === 'object' && !(options.fill instanceof fabric.Gradient)) { this.set('fill', new fabric.Gradient(options.fill)); } }, @@ -792,8 +791,6 @@ : -h - (strokeWidth * this.scaleY) - (padding * 2) ) / 2; - var rotateWidth = (-w/2); - ctx.beginPath(); ctx.moveTo(0, rotateHeight); ctx.lineTo(0, rotateHeight + (this.flipY ? this.rotatingPointOffset : -this.rotatingPointOffset)); @@ -816,8 +813,6 @@ x = -this.width/2, y = -this.height/2, _this = this, padding = this.padding, - width = this.getWidth(), - height = this.getHeight(), dashedArrayLength = this.strokeDashArray.length; ctx.save(); @@ -826,6 +821,7 @@ function renderSide(xMultiplier, yMultiplier) { var lineLength = 0, + lengthDiff = 0, sideLength = (yMultiplier ? _this.height : _this.width) + padding * 2; while (lineLength < sideLength) { @@ -834,7 +830,7 @@ lineLength += lengthOfSubPath; if (lineLength > sideLength) { - var lengthDiff = lineLength - sideLength; + lengthDiff = lineLength - sideLength; } // track coords @@ -1030,7 +1026,7 @@ */ toDataURL: function(callback) { var el = fabric.document.createElement('canvas'); - if (!el.getContext && typeof G_vmlCanvasManager != 'undefined') { + if (!el.getContext && typeof G_vmlCanvasManager !== 'undefined') { G_vmlCanvasManager.initElement(el); } @@ -1132,7 +1128,7 @@ tr: new fabric.Point(oCoords.tr.x, oCoords.tr.y), bl: new fabric.Point(oCoords.bl.x, oCoords.bl.y), br: new fabric.Point(oCoords.br.x, oCoords.br.y) - } + }; } var thisCoords = getCoords(this.oCoords), otherCoords = getCoords(other.oCoords); @@ -1166,8 +1162,7 @@ var oCoords = this.oCoords, tl = new fabric.Point(oCoords.tl.x, oCoords.tl.y), tr = new fabric.Point(oCoords.tr.x, oCoords.tr.y), - bl = new fabric.Point(oCoords.bl.x, oCoords.bl.y), - br = new fabric.Point(oCoords.br.x, oCoords.br.y); + bl = new fabric.Point(oCoords.bl.x, oCoords.bl.y); return tl.x > selectionTL.x && tr.x < selectionBR.x @@ -1228,7 +1223,7 @@ // canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); xpoints = this._findCrossPoints(ex, ey, lines); - if (xpoints % 2 == 1 && xpoints != 0) { + if (xpoints % 2 === 1 && xpoints !== 0) { this.__corner = i; return i; } @@ -1261,7 +1256,7 @@ continue; } // optimisation 3: vertical line case - if ((iLine.o.x == iLine.d.x) && (iLine.o.x >= ex)) { + if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= ex)) { xi = iLine.o.x; yi = ey; } @@ -1280,7 +1275,7 @@ xcount += 1; } // optimisation 4: specific for square images - if (xcount == 2) { + if (xcount === 2) { break; } } @@ -1293,7 +1288,7 @@ * @private * @param oCoords {Object} coordinates of the image corners */ - _getImageLines: function(oCoords, i) { + _getImageLines: function(oCoords) { return { topline: { o: oCoords.tl, @@ -1311,7 +1306,7 @@ o: oCoords.bl, d: oCoords.tl } - } + }; }, /** @@ -1554,7 +1549,7 @@ * */ animate: function() { - if (arguments[0] && typeof arguments[0] == 'object') { + if (arguments[0] && typeof arguments[0] === 'object') { for (var prop in arguments[0]) { this._animate(prop, arguments[0][prop], arguments[1]); } @@ -1578,7 +1573,7 @@ options.from = this.get(property); } - if (/[+-]/.test((to + '').charAt(0))) { + if (/[+\-]/.test((to + '').charAt(0))) { to = this.get(property) + parseFloat(to); } @@ -1731,4 +1726,4 @@ }); -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); diff --git a/src/observable.js b/src/observable.js index b59c4125..c0e0790f 100644 --- a/src/observable.js +++ b/src/observable.js @@ -52,7 +52,7 @@ fabric.Observable = { */ fire: function(eventName, options) { if (!this.__eventListeners) { - this.__eventListeners = { } + this.__eventListeners = { }; } var listenersForEvent = this.__eventListeners[eventName]; if (!listenersForEvent) return; diff --git a/src/parser.js b/src/parser.js index f78173a2..a40d75a2 100644 --- a/src/parser.js +++ b/src/parser.js @@ -87,7 +87,7 @@ ownAttributes = extend(ownAttributes, extend(getGlobalStylesForElement(element), fabric.parseStyleAttribute(element))); return extend(parentAttributes, ownAttributes); - }; + } /** * Parses "transform" attribute, returning an array of values @@ -218,9 +218,9 @@ matrix = args; break; } - }) + }); return matrix; - } + }; })(); /** @@ -240,17 +240,21 @@ var asPairs = points.indexOf(',') > -1; points = points.split(/\s+/); - var parsedPoints = [ ]; + var parsedPoints = [ ], i, len; // points could look like "10,20 30,40" or "10 20 30 40" if (asPairs) { - for (var i = 0, len = points.length; i < len; i++) { - var pair = points[i].split(','); - parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); - } + i = 0; + len = points.length; + for (; i < len; i++) { + var pair = points[i].split(','); + parsedPoints.push({ x: parseFloat(pair[0]), y: parseFloat(pair[1]) }); + } } else { - for (var i = 0, len = points.length; i < len; i+=2) { + i = 0; + len = points.length; + for (; i < len; i+=2) { parsedPoints.push({ x: parseFloat(points[i]), y: parseFloat(points[i+1]) }); } } @@ -261,7 +265,7 @@ } return parsedPoints; - }; + } /** * Parses "style" attribute, retuning an object with values @@ -274,22 +278,24 @@ function parseStyleAttribute(element) { var oStyle = { }, style = element.getAttribute('style'); - if (style) { - if (typeof style == 'string') { - style = style.replace(/;$/, '').split(';').forEach(function (current) { - var attr = current.split(':'); - oStyle[normalizeAttr(attr[0].trim().toLowerCase())] = attr[1].trim(); - }); - } else { - for (var prop in style) { - if (typeof style[prop] !== 'undefined') { - oStyle[normalizeAttr(prop.toLowerCase())] = style[prop]; - } - } + + if (!style) return oStyle; + + if (typeof style === 'string') { + style = style.replace(/;$/, '').split(';').forEach(function (current) { + var attr = current.split(':'); + oStyle[normalizeAttr(attr[0].trim().toLowerCase())] = attr[1].trim(); + }); + } + else { + for (var prop in style) { + if (typeof style[prop] === 'undefined') continue; + oStyle[normalizeAttr(prop.toLowerCase())] = style[prop]; } } + return oStyle; - }; + } function resolveGradients(instances) { for (var i = instances.length; i--; ) { @@ -318,7 +324,7 @@ * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. */ function parseElements(elements, callback, options, reviver) { - var instances = Array(elements.length), i = elements.length; + var instances = new Array(elements.length), i = elements.length; function checkIfDone() { if (--i === 0) { @@ -359,7 +365,7 @@ checkIfDone(); } } - }; + } /** * Returns CSS rules for a given SVG document @@ -383,12 +389,12 @@ styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); - rules = rules.map(function(rule) { return rule.trim() }); + rules = rules.map(function(rule) { return rule.trim(); }); rules.forEach(function(rule) { - var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/), - rule = match[1], - declaration = match[2].trim(), + var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/); + rule = match[1]; + var declaration = match[2].trim(), propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); if (!allRules[rule]) { @@ -550,7 +556,7 @@ * @param {String} url * @param {Function} callback */ - get: function (url, callback) { + get: function () { /* NOOP */ }, @@ -559,7 +565,7 @@ * @param {String} url * @param {Object} object */ - set: function (url, object) { + set: function () { /* NOOP */ } }; @@ -643,7 +649,7 @@ } } else if (fabric.window.ActiveXObject) { - var doc = new ActiveXObject('Microsoft.XMLDOM'); + doc = new ActiveXObject('Microsoft.XMLDOM'); doc.async = 'false'; //IE chokes on DOCTYPE doc.loadXML(string.replace(//i,'')); @@ -697,4 +703,4 @@ createSVGFontFacesMarkup: createSVGFontFacesMarkup }); -})(typeof exports != 'undefined' ? exports : this); +})(typeof exports !== 'undefined' ? exports : this); diff --git a/src/path.class.js b/src/path.class.js index 309d8901..ed2631b7 100644 --- a/src/path.class.js +++ b/src/path.class.js @@ -66,7 +66,7 @@ var sfactor_sq = 1 / d - 0.25; if (sfactor_sq < 0) sfactor_sq = 0; var sfactor = Math.sqrt(sfactor_sq); - if (sweep == large) sfactor = -sfactor; + if (sweep === large) sfactor = -sfactor; var xc = 0.5 * (x0 + x1) - sfactor * (y1-y0); var yc = 0.5 * (y0 + y1) + sfactor * (x1-x0); @@ -74,9 +74,9 @@ var th1 = Math.atan2(y1-yc, x1-xc); var th_arc = th1-th0; - if (th_arc < 0 && sweep == 1){ + if (th_arc < 0 && sweep === 1){ th_arc += 2*Math.PI; - } else if (th_arc > 0 && sweep == 0) { + } else if (th_arc > 0 && sweep === 0) { th_arc -= 2 * Math.PI; } @@ -179,7 +179,7 @@ this.setOptions(options); if (!path) { - throw Error('`path` argument is required'); + throw new Error('`path` argument is required'); } var fromArray = _toString.call(path) === '[object Array]'; @@ -631,7 +631,7 @@ chunks, parsed; - for (var i = 0, j, chunksParsed, len = this.path.length; i < len; i++) { + for (var i = 0, chunksParsed, len = this.path.length; i < len; i++) { currentPath = this.path[i]; chunks = currentPath.slice(1).trim().replace(/(\d)-/g, '$1###-').split(/\s|,|###/); chunksParsed = [ currentPath.charAt(0) ]; @@ -759,4 +759,4 @@ return new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/path_group.class.js b/src/path_group.class.js index e0b9d8be..46fa6791 100644 --- a/src/path_group.class.js +++ b/src/path_group.class.js @@ -5,7 +5,6 @@ var fabric = global.fabric || (global.fabric = { }), extend = fabric.util.object.extend, invoke = fabric.util.array.invoke, - parentSet = fabric.Object.prototype.set, parentToObject = fabric.Object.prototype.toObject, camelize = fabric.util.string.camelize, capitalize = fabric.util.string.capitalize; @@ -237,4 +236,4 @@ return new fabric.PathGroup(paths, object); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/point.class.js b/src/point.class.js index 59375edb..ba455a46 100644 --- a/src/point.class.js +++ b/src/point.class.js @@ -1,18 +1,18 @@ (function(global) { - + "use strict"; - + /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */ - + var fabric = global.fabric || (global.fabric = { }); - if (fabric.Point) { + if (fabric.Point) { fabric.warn('fabric.Point is already defined'); return; } fabric.Point = Point; - + /** * @name Point * @memberOf fabric @@ -26,11 +26,11 @@ this.init(x, y); } } - + Point.prototype = /** @scope fabric.Point.prototype */ { - + constructor: Point, - + /** * @method init * @param {Number} x @@ -40,7 +40,7 @@ this.x = x; this.y = y; }, - + /** * @method add * @param {fabric.Point} that @@ -49,7 +49,7 @@ add: function (that) { return new Point(this.x + that.x, this.y + that.y); }, - + /** * @method addEquals * @param {fabric.Point} that @@ -60,7 +60,7 @@ this.y += that.y; return this; }, - + /** * @method scalarAdd * @param {Number} scalar @@ -69,7 +69,7 @@ scalarAdd: function (scalar) { return new Point(this.x + scalar, this.y + scalar); }, - + /** * @method scalarAddEquals * @param {Number} scalar @@ -80,7 +80,7 @@ this.y += scalar; return this; }, - + /** * @method subtract * @param {fabric.Point} that @@ -89,7 +89,7 @@ subtract: function (that) { return new Point(this.x - that.x, this.y - that.y); }, - + /** * @method subtractEquals * @param {fabric.Point} that @@ -100,89 +100,89 @@ this.y -= that.y; return this; }, - + scalarSubtract: function (scalar) { return new Point(this.x - scalar, this.y - scalar); }, - + scalarSubtractEquals: function (scalar) { this.x -= scalar; this.y -= scalar; return this; }, - + multiply: function (scalar) { return new Point(this.x * scalar, this.y * scalar); }, - + multiplyEquals: function (scalar) { this.x *= scalar; this.y *= scalar; return this; }, - + divide: function (scalar) { return new Point(this.x / scalar, this.y / scalar); }, - + divideEquals: function (scalar) { this.x /= scalar; this.y /= scalar; return this; }, - + eq: function (that) { - return (this.x == that.x && this.y == that.y); + return (this.x === that.x && this.y === that.y); }, - + lt: function (that) { return (this.x < that.x && this.y < that.y); }, - + lte: function (that) { return (this.x <= that.x && this.y <= that.y); }, - + gt: function (that) { return (this.x > that.x && this.y > that.y); }, - + gte: function (that) { return (this.x >= that.x && this.y >= that.y); }, - + lerp: function (that, t) { return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t); }, - + distanceFrom: function (that) { var dx = this.x - that.x, dy = this.y - that.y; return Math.sqrt(dx * dx + dy * dy); }, - + min: function (that) { return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y)); }, - + max: function (that) { return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y)); }, - + toString: function () { return this.x + "," + this.y; }, - + setXY: function (x, y) { this.x = x; this.y = y; }, - + setFromPoint: function (that) { this.x = that.x; this.y = that.y; }, - + swap: function (that) { var x = this.x, y = this.y; @@ -192,5 +192,5 @@ that.y = y; } }; - -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file + +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/polygon.class.js b/src/polygon.class.js index f7256f7e..e0e2fe4c 100644 --- a/src/polygon.class.js +++ b/src/polygon.class.js @@ -13,9 +13,6 @@ return; } - function byX(p) { return p.x; } - function byY(p) { return p.y; } - /** * @class Polygon * @extends fabric.Object @@ -168,4 +165,4 @@ return new fabric.Polygon(object.points, object); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/polyline.class.js b/src/polyline.class.js index ec29d25c..6946ffd7 100644 --- a/src/polyline.class.js +++ b/src/polyline.class.js @@ -149,4 +149,4 @@ return new fabric.Polyline(points, object); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/rect.class.js b/src/rect.class.js index f06c2251..c49625cd 100644 --- a/src/rect.class.js +++ b/src/rect.class.js @@ -217,4 +217,4 @@ return new fabric.Rect(object); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/static_canvas.class.js b/src/static_canvas.class.js index 184b4fe1..f990d587 100644 --- a/src/static_canvas.class.js +++ b/src/static_canvas.class.js @@ -1,4 +1,4 @@ -(function (global) { +(function () { "use strict"; @@ -103,7 +103,7 @@ * @method onBeforeScaleRotate * @param {fabric.Object} target Object that's about to be scaled/rotated */ - onBeforeScaleRotate: function (target) { + onBeforeScaleRotate: function () { /* NOOP */ }, @@ -481,39 +481,24 @@ this.clearContext(canvasToDrawOn); } - var length = this._objects.length, - activeGroup = this.getActiveGroup(), + var activeGroup = this.getActiveGroup(), startTime = new Date(); if (this.clipTo) { - canvasToDrawOn.save(); - canvasToDrawOn.beginPath(); - this.clipTo(canvasToDrawOn); - canvasToDrawOn.clip(); + this._clipCanvas(canvasToDrawOn); } canvasToDrawOn.fillStyle = this.backgroundColor; canvasToDrawOn.fillRect(0, 0, this.width, this.height); - if (typeof this.backgroundImage == 'object') { - canvasToDrawOn.save(); - canvasToDrawOn.globalAlpha = this.backgroundImageOpacity; - - if (this.backgroundImageStretch) { - canvasToDrawOn.drawImage(this.backgroundImage, 0, 0, this.width, this.height); - } - else { - canvasToDrawOn.drawImage(this.backgroundImage, 0, 0); - } - canvasToDrawOn.restore(); + if (typeof this.backgroundImage === 'object') { + this._drawBackroundImage(canvasToDrawOn); } - if (length) { - for (var i = 0; i < length; ++i) { - if (!activeGroup || - (activeGroup && this._objects[i] && !activeGroup.contains(this._objects[i]))) { - this._draw(canvasToDrawOn, this._objects[i]); - } + for (var i = 0, length = this._objects.length; i < length; ++i) { + if (!activeGroup || + (activeGroup && this._objects[i] && !activeGroup.contains(this._objects[i]))) { + this._draw(canvasToDrawOn, this._objects[i]); } } @@ -544,6 +529,26 @@ return this; }, + _clipCanvas: function(canvasToDrawOn) { + canvasToDrawOn.save(); + canvasToDrawOn.beginPath(); + this.clipTo(canvasToDrawOn); + canvasToDrawOn.clip(); + }, + + _drawBackroundImage: function(canvasToDrawOn) { + canvasToDrawOn.save(); + canvasToDrawOn.globalAlpha = this.backgroundImageOpacity; + + if (this.backgroundImageStretch) { + canvasToDrawOn.drawImage(this.backgroundImage, 0, 0, this.width, this.height); + } + else { + canvasToDrawOn.drawImage(this.backgroundImage, 0, 0); + } + canvasToDrawOn.restore(); + }, + /** * Method to render only the top canvas. * Also used to render the group selection box. @@ -776,8 +781,9 @@ var data = { objects: this._objects.map(function (instance) { // TODO (kangax): figure out how to clean this up + var originalValue; if (!this.includeDefaultValues) { - var originalValue = instance.includeDefaultValues; + originalValue = instance.includeDefaultValues; instance.includeDefaultValues = false; } var object = instance[methodName](); @@ -1102,9 +1108,9 @@ try { el.toDataURL('image/jpeg', 0); return true; - } catch (e) { - return false; } + catch (e) { } + return false; default: return null; @@ -1120,4 +1126,4 @@ */ fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject; -})(typeof exports != 'undefined' ? exports : this); +})(); \ No newline at end of file diff --git a/src/text.class.js b/src/text.class.js index ed901093..3bd4c05d 100644 --- a/src/text.class.js +++ b/src/text.class.js @@ -133,7 +133,7 @@ _initDimensions: function() { var canvasEl = fabric.document.createElement('canvas'); - if (!canvasEl.getContext && typeof G_vmlCanvasManager != 'undefined') { + if (!canvasEl.getContext && typeof G_vmlCanvasManager !== 'undefined') { G_vmlCanvasManager.initElement(canvasEl); } @@ -445,29 +445,30 @@ _renderTextDecoration: function(ctx, textLines) { var halfOfVerticalBox = this._getTextHeight(ctx, textLines) / 2; + var _this = this; function renderLinesAtOffset(offset) { for (var i = 0, len = textLines.length; i < len; i++) { var lineWidth = ctx.measureText(textLines[i]).width; - var lineLeftOffset = this._getLineLeftOffset(lineWidth); + var lineLeftOffset = _this._getLineLeftOffset(lineWidth); ctx.fillRect( - (-this.width / 2) + lineLeftOffset, - (offset + (i * this.fontSize * this.lineHeight)) - halfOfVerticalBox, + (-_this.width / 2) + lineLeftOffset, + (offset + (i * _this.fontSize * _this.lineHeight)) - halfOfVerticalBox, lineWidth, 1); } } if (this.textDecoration.indexOf('underline') > -1) { - renderLinesAtOffset.call(this, this.fontSize); + renderLinesAtOffset(this.fontSize); } if (this.textDecoration.indexOf('line-through') > -1) { - renderLinesAtOffset.call(this, this.fontSize / 2); + renderLinesAtOffset(this.fontSize / 2); } if (this.textDecoration.indexOf('overline') > -1) { - renderLinesAtOffset.call(this, 0); + renderLinesAtOffset(0); } }, @@ -495,7 +496,7 @@ // Cufon doesn't play nice with textDecoration=underline if element doesn't have a parent container.appendChild(el); - if (typeof G_vmlCanvasManager == 'undefined') { + if (typeof G_vmlCanvasManager === 'undefined') { el.innerHTML = this.text; } else { @@ -779,10 +780,10 @@ } var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES); - var options = fabric.util.object.extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes); + options = fabric.util.object.extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes); var text = new fabric.Text(element.textContent, options); return text; }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/triangle.class.js b/src/triangle.class.js index e46f00cb..771a7601 100644 --- a/src/triangle.class.js +++ b/src/triangle.class.js @@ -1,26 +1,26 @@ (function(global) { - + "use strict"; - + var fabric = global.fabric || (global.fabric = { }); - + if (fabric.Triangle) { fabric.warn('fabric.Triangle is already defined'); return; } - - /** + + /** * @class Triangle * @extends fabric.Object */ fabric.Triangle = fabric.util.createClass(fabric.Object, /** @scope fabric.Triangle.prototype */ { - + /** * @property * @type String */ type: 'triangle', - + /** * Constructor * @method initialize @@ -29,28 +29,28 @@ */ initialize: function(options) { options = options || { }; - + this.callSuper('initialize', options); - + this.set('width', options.width || 100) .set('height', options.height || 100); }, - + /** * @private * @method _render * @param ctx {CanvasRenderingContext2D} Context to render on */ - _render: function(ctx) { + _render: function(ctx) { var widthBy2 = this.width / 2, heightBy2 = this.height / 2; - + ctx.beginPath(); ctx.moveTo(-widthBy2, heightBy2); ctx.lineTo(0, -heightBy2); ctx.lineTo(widthBy2, heightBy2); ctx.closePath(); - + if (this.fill) { ctx.fill(); } @@ -58,7 +58,7 @@ ctx.stroke(); } }, - + /** * Returns complexity of an instance * @method complexity @@ -67,7 +67,7 @@ complexity: function() { return 1; }, - + /** * Returns svg representation of an instance * @method toSVG @@ -91,7 +91,7 @@ '/>'; } }); - + /** * Returns fabric.Triangle instance from an object representation * @static @@ -103,4 +103,4 @@ return new fabric.Triangle(object); }; -})(typeof exports != 'undefined' ? exports : this); \ No newline at end of file +})(typeof exports !== 'undefined' ? exports : this); \ No newline at end of file diff --git a/src/util/anim_ease.js b/src/util/anim_ease.js index ce268030..1c069cdd 100644 --- a/src/util/anim_ease.js +++ b/src/util/anim_ease.js @@ -21,7 +21,8 @@ * @memberOf fabric.util.ease */ function easeInOutQuad(t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t + b; + t /= (d/2); + if (t < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; } @@ -46,7 +47,8 @@ * @memberOf fabric.util.ease */ function easeInOutCubic(t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t + b; + t /= d/2; + if (t < 1) return c/2*t*t*t + b; return c/2*((t-=2)*t*t + 2) + b; } @@ -71,7 +73,8 @@ * @memberOf fabric.util.ease */ function easeInOutQuart(t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + t /= d/2; + if (t < 1) return c/2*t*t*t*t + b; return -c/2 * ((t-=2)*t*t*t - 2) + b; } @@ -96,7 +99,8 @@ * @memberOf fabric.util.ease */ function easeInOutQuint(t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + t /= d/2; + if (t < 1) return c/2*t*t*t*t*t + b; return c/2*((t-=2)*t*t*t*t + 2) + b; } @@ -129,7 +133,7 @@ * @memberOf fabric.util.ease */ function easeInExpo(t, b, c, d) { - return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + return (t===0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; } /** @@ -137,7 +141,7 @@ * @memberOf fabric.util.ease */ function easeOutExpo(t, b, c, d) { - return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + return (t===d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; } /** @@ -145,9 +149,10 @@ * @memberOf fabric.util.ease */ function easeInOutExpo(t, b, c, d) { - if (t==0) return b; - if (t==d) return b+c; - if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + if (t===0) return b; + if (t===d) return b+c; + t /= d/2; + if (t < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; } @@ -172,7 +177,8 @@ * @memberOf fabric.util.ease */ function easeInOutCirc(t, b, c, d) { - if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + t /= d/2; + if (t < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; } @@ -182,9 +188,12 @@ */ function easeInElastic(t, b, c, d) { var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t===0) return b; + t /= d; + if (t===1) return b+c; + if (!p) p=d*0.3; + if (a < Math.abs(c)) { a=c; s=p/4; } + else s = p/(2*Math.PI) * Math.asin (c/a); return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; } @@ -194,9 +203,12 @@ */ function easeOutElastic(t, b, c, d) { var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t===0) return b; + t /= d; + if (t===1) return b+c; + if (!p) p=d*0.3; + if (a < Math.abs(c)) { a=c; s=p/4; } + else s = p/(2*Math.PI) * Math.asin (c/a); return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; } @@ -206,11 +218,14 @@ */ function easeInOutElastic(t, b, c, d) { var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); - if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; - return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + if (t===0) return b; + t /= d/2; + if (t===2) return b+c; + if (!p) p=d*(0.3*1.5); + if (a < Math.abs(c)) { a=c; s=p/4; } + else s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -0.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b; } /** @@ -218,7 +233,7 @@ * @memberOf fabric.util.ease */ function easeInBack(t, b, c, d, s) { - if (s == undefined) s = 1.70158; + if (s === undefined) s = 1.70158; return c*(t/=d)*t*((s+1)*t - s) + b; } @@ -227,7 +242,7 @@ * @memberOf fabric.util.ease */ function easeOutBack(t, b, c, d, s) { - if (s == undefined) s = 1.70158; + if (s === undefined) s = 1.70158; return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; } @@ -236,8 +251,9 @@ * @memberOf fabric.util.ease */ function easeInOutBack(t, b, c, d, s) { - if (s == undefined) s = 1.70158; - if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + if (s === undefined) s = 1.70158; + t /= d/2; + if (t < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; } @@ -257,11 +273,11 @@ if ((t/=d) < (1/2.75)) { return c*(7.5625*t*t) + b; } else if (t < (2/2.75)) { - return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b; } else if (t < (2.5/2.75)) { - return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b; } else { - return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b; } } @@ -270,8 +286,8 @@ * @memberOf fabric.util.ease */ function easeInOutBounce(t, b, c, d) { - if (t < d/2) return easeInBounce (t*2, 0, c, d) * .5 + b; - return easeOutBounce (t*2-d, 0, c, d) * .5 + c*.5 + b; + if (t < d/2) return easeInBounce (t*2, 0, c, d) * 0.5 + b; + return easeOutBounce (t*2-d, 0, c, d) * 0.5 + c*0.5 + b; } /** @namespace fabric.util.ease */ diff --git a/src/util/dom_event.js b/src/util/dom_event.js index 709e9977..b3667209 100644 --- a/src/util/dom_event.js +++ b/src/util/dom_event.js @@ -1,4 +1,4 @@ -(function (global) { +(function () { /* EVENT HANDLING */ @@ -183,26 +183,26 @@ return { x: pointerX(event), y: pointerY(event) }; } - function pointerX(event) { + var pointerX = function(event) { var docElement = fabric.document.documentElement, body = fabric.document.body || { scrollLeft: 0 }; // looks like in IE (<9) clientX at certain point (apparently when mouseup fires on VML element) // is represented as COM object, with all the consequences, like "unknown" type and error on [[Get]] // need to investigate later - return event.pageX || ((typeof event.clientX != 'unknown' ? event.clientX : 0) + + return event.pageX || ((typeof event.clientX !== 'unknown' ? event.clientX : 0) + (docElement.scrollLeft || body.scrollLeft) - (docElement.clientLeft || 0)); - } + }; - function pointerY(event) { + var pointerY = function(event) { var docElement = fabric.document.documentElement, body = fabric.document.body || { scrollTop: 0 }; - return event.pageY || ((typeof event.clientY != 'unknown' ? event.clientY : 0) + + return event.pageY || ((typeof event.clientY !== 'unknown' ? event.clientY : 0) + (docElement.scrollTop || body.scrollTop) - (docElement.clientTop || 0)); - } + }; if (fabric.isTouchSupported) { pointerX = function(event) { @@ -217,4 +217,4 @@ fabric.util.object.extend(fabric.util, fabric.Observable); -})(this); \ No newline at end of file +})(); \ No newline at end of file diff --git a/src/util/dom_misc.js b/src/util/dom_misc.js index fb48c4b6..5a964a53 100644 --- a/src/util/dom_misc.js +++ b/src/util/dom_misc.js @@ -1,5 +1,5 @@ (function() { - + var _slice = Array.prototype.slice; /** @@ -20,12 +20,13 @@ * @param {Object} arrayLike * @return {Array} */ - function toArray(arrayLike) { + var toArray = function(arrayLike) { return _slice.call(arrayLike, 0); - } + }; + var sliceCanConvertNodelists; try { - var sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array; + sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array; } catch(err) { } @@ -73,7 +74,7 @@ function addClass(element, className) { if ((' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) { element.className += (element.className ? ' ' : '') + className; - } + } } /** @@ -111,7 +112,7 @@ valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; - } + } while (element); return ({ left: valueL, top: valueT }); } @@ -121,12 +122,12 @@ var selectProp = 'userSelect' in style ? 'userSelect' - : 'MozUserSelect' in style - ? 'MozUserSelect' - : 'WebkitUserSelect' in style - ? 'WebkitUserSelect' - : 'KhtmlUserSelect' in style - ? 'KhtmlUserSelect' + : 'MozUserSelect' in style + ? 'MozUserSelect' + : 'WebkitUserSelect' in style + ? 'WebkitUserSelect' + : 'KhtmlUserSelect' in style + ? 'KhtmlUserSelect' : ''; /** @@ -143,7 +144,7 @@ if (selectProp) { element.style[selectProp] = 'none'; } - else if (typeof element.unselectable == 'string') { + else if (typeof element.unselectable === 'string') { element.unselectable = 'on'; } return element; @@ -163,7 +164,7 @@ if (selectProp) { element.style[selectProp] = ''; } - else if (typeof element.unselectable == 'string') { + else if (typeof element.unselectable === 'string') { element.unselectable = ''; } return element; @@ -183,28 +184,28 @@ * @param {Function} callback Callback to execute when script is finished loading */ function getScript(url, callback) { - var headEl = fabric.document.getElementsByTagName("head")[0], - scriptEl = fabric.document.createElement('script'), - loading = true; + var headEl = fabric.document.getElementsByTagName("head")[0], + scriptEl = fabric.document.createElement('script'), + loading = true; - scriptEl.type = 'text/javascript'; - scriptEl.setAttribute('runat', 'server'); + scriptEl.type = 'text/javascript'; + scriptEl.setAttribute('runat', 'server'); - /** @ignore */ - scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) { - if (loading) { - if (typeof this.readyState == 'string' && - this.readyState !== 'loaded' && - this.readyState !== 'complete') return; - loading = false; - callback(e || fabric.window.event); - scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null; - } - }; - scriptEl.src = url; - headEl.appendChild(scriptEl); - // causes issue in Opera - // headEl.removeChild(scriptEl); + /** @ignore */ + scriptEl.onload = /** @ignore */ scriptEl.onreadystatechange = function(e) { + if (loading) { + if (typeof this.readyState === 'string' && + this.readyState !== 'loaded' && + this.readyState !== 'complete') return; + loading = false; + callback(e || fabric.window.event); + scriptEl = scriptEl.onload = scriptEl.onreadystatechange = null; + } + }; + scriptEl.src = url; + headEl.appendChild(scriptEl); + // causes issue in Opera + // headEl.removeChild(scriptEl); } fabric.util.getScript = getScript; @@ -216,5 +217,5 @@ fabric.util.addClass = addClass; fabric.util.wrapElement = wrapElement; fabric.util.getElementOffset = getElementOffset; - + })(); \ No newline at end of file diff --git a/src/util/dom_request.js b/src/util/dom_request.js index d68e5d36..5a53915f 100644 --- a/src/util/dom_request.js +++ b/src/util/dom_request.js @@ -1,9 +1,9 @@ (function(){ - + function addParamToUrl(url, param) { return url + (/\?/.test(url) ? '&' : '?') + param; } - + var makeXHR = (function() { var factories = [ function() { return new ActiveXObject("Microsoft.XMLHTTP"); }, @@ -22,8 +22,8 @@ } })(); - function emptyFn() { }; - + function emptyFn() { } + /** * Cross-browser abstraction for sending XMLHttpRequest * @method request @@ -40,33 +40,33 @@ var method = options.method ? options.method.toUpperCase() : 'GET', onComplete = options.onComplete || function() { }, - request = makeXHR(), + xhr = makeXHR(), body; - + /** @ignore */ - request.onreadystatechange = function() { - if (request.readyState === 4) { - onComplete(request); - request.onreadystatechange = emptyFn; + xhr.onreadystatechange = function() { + if (xhr.readyState === 4) { + onComplete(xhr); + xhr.onreadystatechange = emptyFn; } }; - + if (method === 'GET') { body = null; - if (typeof options.parameters == 'string') { + if (typeof options.parameters === 'string') { url = addParamToUrl(url, options.parameters); } } - request.open(method, url, true); - + xhr.open(method, url, true); + if (method === 'POST' || method === 'PUT') { - request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } - request.send(body); - return request; - }; - + xhr.send(body); + return xhr; + } + fabric.util.request = request; })(); \ No newline at end of file diff --git a/src/util/dom_style.js b/src/util/dom_style.js index ee604cf5..e1d1c37a 100644 --- a/src/util/dom_style.js +++ b/src/util/dom_style.js @@ -9,7 +9,7 @@ * @return {HTMLElement} Element that was passed as a first argument */ function setStyle(element, styles) { - var elementStyle = element.style, match; + var elementStyle = element.style; if (!elementStyle) { return element; } @@ -36,8 +36,6 @@ var parseEl = fabric.document.createElement('div'), supportsOpacity = typeof parseEl.style.opacity === 'string', supportsFilters = typeof parseEl.style.filter === 'string', - view = fabric.document.defaultView, - supportsGCS = view && typeof view.getComputedStyle !== 'undefined', reOpacity = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/, /** @ignore */ diff --git a/src/util/lang_array.js b/src/util/lang_array.js index 4ebdb3db..0866966a 100644 --- a/src/util/lang_array.js +++ b/src/util/lang_array.js @@ -1,7 +1,7 @@ (function() { - + var slice = Array.prototype.slice; - + if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { if (this === void 0 || this === null) { @@ -31,7 +31,7 @@ } } return -1; - } + }; } if (!Array.prototype.forEach) { @@ -39,7 +39,7 @@ for (var i = 0, len = this.length >>> 0; i < len; i++) { if (i in this) { fn.call(context, this[i], i, this); - } + } } }; } @@ -148,8 +148,8 @@ */ function max(array, byProperty) { if (!array || array.length === 0) return undefined; - - var i = array.length - 1, + + var i = array.length - 1, result = byProperty ? array[i][byProperty] : array[i]; if (byProperty) { while (i--) { @@ -177,8 +177,8 @@ */ function min(array, byProperty) { if (!array || array.length === 0) return undefined; - - var i = array.length - 1, + + var i = array.length - 1, result = byProperty ? array[i][byProperty] : array[i]; if (byProperty) { @@ -204,5 +204,5 @@ min: min, max: max }; - + })(); \ No newline at end of file diff --git a/src/util/lang_class.js b/src/util/lang_class.js index 57b11716..75086960 100644 --- a/src/util/lang_class.js +++ b/src/util/lang_class.js @@ -13,7 +13,7 @@ var addMethods = function(klass, source, parent) { for (var property in source) { - if (property in klass.prototype && typeof klass.prototype[property] == 'function') { + if (property in klass.prototype && typeof klass.prototype[property] === 'function') { klass.prototype[property] = (function(property) { return function() { @@ -26,7 +26,7 @@ if (property !== 'initialize') { return returnValue; } - } + }; })(property); } else { @@ -44,7 +44,7 @@ } }; - function subclass() { }; + function Subclass() { } /** * Helper for creation of "classes" @@ -66,8 +66,8 @@ klass.subclasses = [ ]; if (parent) { - subclass.prototype = parent.prototype; - klass.prototype = new subclass; + Subclass.prototype = parent.prototype; + klass.prototype = new Subclass(); parent.subclasses.push(klass); } for (var i = 0, length = properties.length; i < length; i++) { diff --git a/src/util/lang_function.js b/src/util/lang_function.js index 9a640da9..dc4131e9 100644 --- a/src/util/lang_function.js +++ b/src/util/lang_function.js @@ -1,9 +1,9 @@ (function() { - + var slice = Array.prototype.slice, apply = Function.prototype.apply, - dummy = function() { }; - + Dummy = function() { }; + if (!Function.prototype.bind) { /** * Cross-browser approximation of ES5 Function.prototype.bind (not fully spec conforming) @@ -15,20 +15,20 @@ Function.prototype.bind = function(thisArg) { var fn = this, args = slice.call(arguments, 1), bound; if (args.length) { - bound = function() { - return apply.call(fn, this instanceof dummy ? this : thisArg, args.concat(slice.call(arguments))); + bound = function() { + return apply.call(fn, this instanceof Dummy ? this : thisArg, args.concat(slice.call(arguments))); }; } else { - bound = function() { - return apply.call(fn, this instanceof dummy ? this : thisArg, arguments); + bound = function() { + return apply.call(fn, this instanceof Dummy ? this : thisArg, arguments); }; } - dummy.prototype = this.prototype; - bound.prototype = new dummy; - + Dummy.prototype = this.prototype; + bound.prototype = new Dummy(); + return bound; }; } - + })(); \ No newline at end of file diff --git a/src/util/misc.js b/src/util/misc.js index ef91a29f..fce0d673 100644 --- a/src/util/misc.js +++ b/src/util/misc.js @@ -21,7 +21,7 @@ array.splice(idx, 1); } return array; - }; + } /** * Returns random number between 2 specified ones. @@ -93,19 +93,19 @@ var start = +new Date(), duration = options.duration || 500, - finish = start + duration, time, pos, + finish = start + duration, time, onChange = options.onChange || function() { }, abort = options.abort || function() { return false; }, easing = options.easing || function(t, b, c, d) {return -c * Math.cos(t/d * (Math.PI/2)) + c + b;}, startValue = 'startValue' in options ? options.startValue : 0, - endValue = 'endValue' in options ? options.endValue : 100; + endValue = 'endValue' in options ? options.endValue : 100, byValue = options.byValue || endValue - startValue; options.onStart && options.onStart(); (function tick() { time = +new Date(); - currentTime = time > finish ? duration : (time - start); + var currentTime = time > finish ? duration : (time - start); onChange(easing(currentTime, startValue, byValue, duration)); if (time > finish || abort()) { options.onComplete && options.onComplete(); @@ -120,7 +120,7 @@ fabric.window.mozRequestAnimationFrame || fabric.window.oRequestAnimationFrame || fabric.window.msRequestAnimationFrame || - function(callback, element) { + function(callback) { fabric.window.setTimeout(callback, 1000 / 60); }; /** @@ -193,6 +193,15 @@ }); } + /** + * Groups SVG elements (usually those retrieved from SVG document) + * @static + * @memberOf fabric.util + * @method groupSVGElements + * @param {Array} elements + * @param {Object} options optional + * @return {String} path optional + */ function groupSVGElements(elements, options, path) { var object = elements.length > 1 ? new fabric.PathGroup(elements, options)