diff --git a/dist/all.js b/dist/all.js index 7d861916..ecada327 100644 --- a/dist/all.js +++ b/dist/all.js @@ -833,7 +833,6 @@ if (!Function.prototype.bind) { fabric.util.addListener = addListener; fabric.util.removeListener = removeListener; - var customEventListeners = { }; function observeEvent(eventName, handler) { @@ -844,16 +843,10 @@ if (!Function.prototype.bind) { } function fireEvent(eventName, memo) { - if (!customEventListeners[eventName]) return; - for (var i = 0, len = customEventListeners[eventName].length; i < len; i++) { - try { - customEventListeners[eventName][i]({ memo: memo }); - } - catch(err) { - setTimeout(function () { - throw err; - }, 0); - } + var listenersForEvent = customEventListeners[eventName]; + if (!listenersForEvent) return; + for (var i = 0, len = listenersForEvent.length; i < len; i++) { + listenersForEvent[i]({ memo: memo }); } } @@ -2081,8 +2074,8 @@ fabric.util.animate = animate; getPointer = fabric.util.getPointer, getElementOffset = fabric.util.getElementOffset, removeFromArray = fabric.util.removeFromArray, - addListener = fabric.util.addlistener, - removeListener = fabric.util.removelistener, + addListener = fabric.util.addListener, + removeListener = fabric.util.removeListener, CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element'), FX_DURATION = 500, @@ -4139,14 +4132,13 @@ fabric.util.animate = animate; clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, capitalize = fabric.util.string.capitalize, - getPointer = fabric.util.getPointer; + getPointer = fabric.util.getPointer, + slice = Array.prototype.slice if (fabric.Object) { return; } - var _slice = Array.prototype.slice; - /** * @class Object * @memberOf Canvas @@ -4216,7 +4208,7 @@ fabric.util.animate = animate; callSuper: function(methodName) { var fn = this.constructor.superclass.prototype[methodName]; return (arguments.length > 1) - ? fn.apply(this, _slice.call(arguments, 1)) + ? fn.apply(this, slice.call(arguments, 1)) : fn.call(this); }, diff --git a/dist/all.min.js b/dist/all.min.js index 4209a416..0480df8c 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -15,15 +15,15 @@ k.shift();a.superclass=c;a.subclasses=[];if(c){e.prototype=c.prototype;a.prototy function a(m,n){return function(v){if(b[m]&&b[m][n])for(var u=b[m][n],w=0,x=u.length;w=0.9999?"":"alpha(opacity="+p*100+")";r.filter=r.filter.replace(a,p)}else r.filter+=" alpha(opacity="+p*100+")";return k};h.util.setStyle=function(k,p){var r=k.style;if(typeof p==="string"){k.style.cssText+= -";"+p;return p.indexOf("opacity")>-1?c(k,p.match(/opacity:\s*(\d?\.?\d*)/)[1]):k}for(var s in p)if(s==="opacity")c(k,p[s]);else r[s==="float"||s==="cssFloat"?typeof r.styleFloat==="undefined"?"cssFloat":"styleFloat":s]=p[s];return k}})();(function(){var e=document.documentElement.style,d="userSelect"in e?"userSelect":"MozUserSelect"in e?"MozUserSelect":"WebkitUserSelect"in e?"WebkitUserSelect":"KhtmlUserSelect"in e?"KhtmlUserSelect":"";h.util.makeElementUnselectable=function(a){if(typeof a.onselectstart!== -"undefined")a.onselectstart=f;if(d)a.style[d]="none";else if(typeof a.unselectable=="string")a.unselectable="on";return a}})();(function(){function e(a,c){d.load(a);c()}h.util.getScript=function(a,c){var k=document.getElementsByTagName("head")[0],p=document.createElement("script"),r=true;p.type="text/javascript";p.setAttribute("runat","server");p.onload=p.onreadystatechange=function(s){if(r)if(!(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete")){r=false;c(s|| -window.event);p=p.onload=p.onreadystatechange=null}};p.src=a;k.appendChild(p)};var d=this.Jaxer;if(d&&d.load)h.util.getScript=e})();h.util.getById=function(e){return typeof e==="string"?document.getElementById(e):e};h.util.toArray=function(e){for(var d=[],a=e.length;a--;)d[a]=e[a];return d};h.util.makeElement=q;h.util.addClass=function(e,d){if((" "+e.className+" ").indexOf(" "+d+" ")===-1)e.className+=(e.className?" ":"")+d};h.util.wrapElement=function(e,d,a){if(typeof d==="string")d=q(d,a);e.parentNode&& -e.parentNode.replaceChild(d,e);d.appendChild(e);return d};h.util.getElementOffset=function(e){var d=0,a=0;do{d+=e.offsetTop||0;a+=e.offsetLeft||0;e=e.offsetParent}while(e);return{left:a,top:d}};h.util.animate=function(e){e||(e={});var d=+new Date,a=e.duration||500,c=d+a,k,p,r=e.onChange||function(){},s=e.easing||function(n){return-Math.cos(n*Math.PI)/2+0.5},t="startValue"in e?e.startValue:0,b="endValue"in e?e.endValue:100,g=t>b;e.onStart&&e.onStart();var m=setInterval(function(){k=+new Date;p=k>c? -1:(k-d)/a;r(g?t-(t-b)*s(p):t+(b-t)*s(p));if(k>c){clearInterval(m);e.onComplete&&e.onComplete()}},10)};(function(){function e(){}var d=function(){for(var a=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}],c=a.length;c--;)try{if(a[c]())return a[c]}catch(k){}}();h.util.request=function(a,c){c||(c={});var k=c.method?c.method.toUpperCase():"GET", -p=c.onComplete||function(){},r=d(),s;r.onreadystatechange=function(){if(r.readyState===4){p(r);r.onreadystatechange=e}};if(k==="GET"){s=null;if(typeof c.parameters=="string")a=a+(/\?/.test(a)?"&":"?")+c.parameters}r.open(k,a,true);if(k==="POST"||k==="PUT")r.setRequestHeader("Content-Type","application/x-www-form-urlencoded");r.send(s);return r}})();(function(){var e=Math.PI/180;h.util.removeFromArray=function(d,a){var c=d.indexOf(a);c!==-1&&d.splice(c,1);return d};h.util.degreesToRadians=function(d){return d* -e};h.util.toFixed=function(d,a){return parseFloat(Number(d).toFixed(a))};h.util.getRandomInt=function(d,a){return Math.floor(Math.random()*(a-d+1))+d}})()})(this); +n){g[m]||(g[m]=[]);g[m].push(n)};h.util.fireEvent=function(m,n){var v=g[m];if(v)for(var u=0,w=v.length;u=0.9999?"":"alpha(opacity="+p*100+")";r.filter=r.filter.replace(a,p)}else r.filter+=" alpha(opacity="+p*100+")";return k};h.util.setStyle=function(k,p){var r=k.style;if(typeof p==="string"){k.style.cssText+=";"+p;return p.indexOf("opacity")> +-1?c(k,p.match(/opacity:\s*(\d?\.?\d*)/)[1]):k}for(var s in p)if(s==="opacity")c(k,p[s]);else r[s==="float"||s==="cssFloat"?typeof r.styleFloat==="undefined"?"cssFloat":"styleFloat":s]=p[s];return k}})();(function(){var e=document.documentElement.style,d="userSelect"in e?"userSelect":"MozUserSelect"in e?"MozUserSelect":"WebkitUserSelect"in e?"WebkitUserSelect":"KhtmlUserSelect"in e?"KhtmlUserSelect":"";h.util.makeElementUnselectable=function(a){if(typeof a.onselectstart!=="undefined")a.onselectstart= +f;if(d)a.style[d]="none";else if(typeof a.unselectable=="string")a.unselectable="on";return a}})();(function(){function e(a,c){d.load(a);c()}h.util.getScript=function(a,c){var k=document.getElementsByTagName("head")[0],p=document.createElement("script"),r=true;p.type="text/javascript";p.setAttribute("runat","server");p.onload=p.onreadystatechange=function(s){if(r)if(!(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete")){r=false;c(s||window.event);p=p.onload= +p.onreadystatechange=null}};p.src=a;k.appendChild(p)};var d=this.Jaxer;if(d&&d.load)h.util.getScript=e})();h.util.getById=function(e){return typeof e==="string"?document.getElementById(e):e};h.util.toArray=function(e){for(var d=[],a=e.length;a--;)d[a]=e[a];return d};h.util.makeElement=q;h.util.addClass=function(e,d){if((" "+e.className+" ").indexOf(" "+d+" ")===-1)e.className+=(e.className?" ":"")+d};h.util.wrapElement=function(e,d,a){if(typeof d==="string")d=q(d,a);e.parentNode&&e.parentNode.replaceChild(d, +e);d.appendChild(e);return d};h.util.getElementOffset=function(e){var d=0,a=0;do{d+=e.offsetTop||0;a+=e.offsetLeft||0;e=e.offsetParent}while(e);return{left:a,top:d}};h.util.animate=function(e){e||(e={});var d=+new Date,a=e.duration||500,c=d+a,k,p,r=e.onChange||function(){},s=e.easing||function(n){return-Math.cos(n*Math.PI)/2+0.5},t="startValue"in e?e.startValue:0,b="endValue"in e?e.endValue:100,g=t>b;e.onStart&&e.onStart();var m=setInterval(function(){k=+new Date;p=k>c?1:(k-d)/a;r(g?t-(t-b)*s(p): +t+(b-t)*s(p));if(k>c){clearInterval(m);e.onComplete&&e.onComplete()}},10)};(function(){function e(){}var d=function(){for(var a=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}],c=a.length;c--;)try{if(a[c]())return a[c]}catch(k){}}();h.util.request=function(a,c){c||(c={});var k=c.method?c.method.toUpperCase():"GET",p=c.onComplete||function(){}, +r=d(),s;r.onreadystatechange=function(){if(r.readyState===4){p(r);r.onreadystatechange=e}};if(k==="GET"){s=null;if(typeof c.parameters=="string")a=a+(/\?/.test(a)?"&":"?")+c.parameters}r.open(k,a,true);if(k==="POST"||k==="PUT")r.setRequestHeader("Content-Type","application/x-www-form-urlencoded");r.send(s);return r}})();(function(){var e=Math.PI/180;h.util.removeFromArray=function(d,a){var c=d.indexOf(a);c!==-1&&d.splice(c,1);return d};h.util.degreesToRadians=function(d){return d*e};h.util.toFixed= +function(d,a){return parseFloat(Number(d).toFixed(a))};h.util.getRandomInt=function(d,a){return Math.floor(Math.random()*(a-d+1))+d}})()})(this); (function(){var l=this.fabric||(this.fabric={}),q=l.util.object.extend,f=l.util.string.capitalize,h=l.util.object.clone,o={cx:"left",x:"left",cy:"top",y:"top",r:"radius","fill-opacity":"opacity","fill-rule":"fillRule","stroke-width":"strokeWidth",transform:"transformMatrix"};l.parseTransformAttribute=function(){function e(r,s){var t=s[0];r[0]=Math.cos(t);r[1]=Math.sin(t);r[2]=-Math.sin(t);r[3]=Math.cos(t)}function d(r,s){var t=s.length===2?s[1]:s[0];r[0]=s[0];r[3]=t}function a(r,s){r[4]=s[0];if(s.length=== 2)r[5]=s[1]}var c=[1,0,0,1,0,0],k=RegExp("^\\s*(?:(?:(?:(?:(matrix)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\))|(?:(translate)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(scale)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(rotate)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(skewX)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\))|(?:(skewY)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\)))(?:(?:\\s+,?\\s*|,\\s*)(?:(?:(matrix)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\))|(?:(translate)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(scale)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(rotate)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(skewX)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\))|(?:(skewY)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\))))*)?)\\s*$"), p=RegExp("(?:(?:(matrix)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\))|(?:(translate)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(scale)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(rotate)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))(?:\\s+,?\\s*|,\\s*)((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)))?\\s*\\))|(?:(skewX)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\))|(?:(skewY)\\s*\\(\\s*((?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?))\\s*\\)))"); @@ -46,7 +46,7 @@ l.prototype.toRgba=function(){var f=this.getSource();return"rgba("+f[0]+","+f[1] function(){var f=this.getSource(),h=parseInt((f[0]*0.3+f[1]*0.59+f[2]*0.11).toFixed(0),10);this.setSource([h,h,h,f[3]]);return this};l.prototype.toBlackWhite=function(f){var h=this.getSource(),o=(h[0]*0.3+h[1]*0.59+h[2]*0.11).toFixed(0);h=h[3];f=f||127;o=Number(o)"};f(fabric.Element,{EMPTY_JSON:'{"objects": [], "background": "white"}',toGrayscale:function(b){var g=b.getContext("2d");b=g.getImageData(0,0,b.width,b.height);var m=b.data,n=b.width,v=b.height,u,w;for(i=0;i1?c.apply(this,d.call(arguments,1)):c.call(this)}, initialize:function(a){this.setOptions(a);this._importProperties();this.originalState={};this.setCoords();this.saveState()},setOptions:function(a){this.options=q(this._getOptions(),a)},_getOptions:function(){return q(f(this._getSuperOptions()),this.options)},_getSuperOptions:function(){var a=this.constructor;if(a)if(a=a.superclass)if((a=a.prototype)&&typeof a._getOptions=="function")return a._getOptions();return{}},_importProperties:function(){this.stateProperties.forEach(function(a){a==="angle"? this.setAngle(this.options[a]):this[a]=this.options[a]},this)},transform:function(a){a.globalAlpha=this.opacity;a.translate(this.left,this.top);a.rotate(this.theta);a.scale(this.scaleX*(this.flipX?-1:1),this.scaleY*(this.flipY?-1:1))},toJSON:function(){return JSON.stringify(this.toObject())},toObject:function(){var a={type:this.type,left:h(this.left,this.NUM_FRACTION_DIGITS),top:h(this.top,this.NUM_FRACTION_DIGITS),width:h(this.width,this.NUM_FRACTION_DIGITS),height:h(this.height,this.NUM_FRACTION_DIGITS), diff --git a/src/element.class.js b/src/element.class.js index c6c3b1a7..eac3a223 100644 --- a/src/element.class.js +++ b/src/element.class.js @@ -17,8 +17,8 @@ getPointer = fabric.util.getPointer, getElementOffset = fabric.util.getElementOffset, removeFromArray = fabric.util.removeFromArray, - addListener = fabric.util.addlistener, - removeListener = fabric.util.removelistener, + addListener = fabric.util.addListener, + removeListener = fabric.util.removeListener, CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element'), FX_DURATION = 500, @@ -1309,25 +1309,28 @@ * @chainable */ fxCenterObjectH: function (object) { - var _this = this, - fx = new APE.anim.Animation(), - startValue = object.get('left'), - endValue = _this.getCenter().left, - step = endValue - startValue; + callbacks = callbacks || { }; - fx.run = function (percent) { - object.set('left', startValue + step * percent); - _this.renderAll(); - }; - - fx.onend = function () { - object.setCoords(); - }; + var empty = function() { }, + onComplete = callbacks.onComplete || empty, + onChange = callbacks.onChange || empty, + _this = this; + + fabric.util.animate({ + startValue: object.get('left'), + endValue: this.getCenter().left, + duration: this.FX_DURATION, + onChange: function(value) { + object.set('left', value); + _this.renderAll(); + onChange(); + }, + onComplete: function() { + object.setCoords(); + onComplete(); + } + }); - fx.duration = FX_DURATION; - fx.transition = APE.anim.Transitions[FX_TRANSITION]; - fx.start(); - return this; }, @@ -1352,25 +1355,29 @@ * @chainable */ fxCenterObjectV: function (object) { - var _this = this, - fx = new APE.anim.Animation(), - startValue = object.get('top'), - endValue = _this.getCenter().top, - step = endValue - startValue; + callbacks = callbacks || { }; - fx.run = function (percent) { - object.set('top', startValue + step * percent).setCoords(); - _this.renderAll(); - }; - - fx.onend = function () { - object.setCoords(); - }; + var empty = function() { }, + onComplete = callbacks.onComplete || empty, + onChange = callbacks.onChange || empty, + _this = this; - fx.duration = FX_DURATION; - fx.transition = APE.anim.Transitions[FX_TRANSITION]; + fabric.util.animate({ + startValue: object.get('top'), + endValue: this.getCenter().top, + duration: this.FX_DURATION, + onChange: function(value) { + object.set('top', value); + _this.renderAll(); + onChange(); + }, + onComplete: function() { + object.setCoords(); + onComplete(); + } + }); - fx.start(); + return this; }, /** diff --git a/src/object.class.js b/src/object.class.js index 007482fc..d25fe751 100644 --- a/src/object.class.js +++ b/src/object.class.js @@ -11,14 +11,13 @@ clone = fabric.util.object.clone, toFixed = fabric.util.toFixed, capitalize = fabric.util.string.capitalize, - getPointer = fabric.util.getPointer; + getPointer = fabric.util.getPointer, + slice = Array.prototype.slice if (fabric.Object) { return; } - var _slice = Array.prototype.slice; - /** * @class Object * @memberOf Canvas @@ -89,7 +88,7 @@ callSuper: function(methodName) { var fn = this.constructor.superclass.prototype[methodName]; return (arguments.length > 1) - ? fn.apply(this, _slice.call(arguments, 1)) + ? fn.apply(this, slice.call(arguments, 1)) : fn.call(this); }, diff --git a/src/path_group.class.js b/src/path_group.class.js index 0bd65e4b..8397985d 100644 --- a/src/path_group.class.js +++ b/src/path_group.class.js @@ -4,7 +4,11 @@ var fabric = this.fabric || (this.fabric = { }), extend = fabric.util.object.extend, - invoke = fabric.util.array.invoke; + 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; if (fabric.PathGroup) { console.warn('fabric.PathGroup is already defined'); @@ -96,7 +100,7 @@ } else { // skipping parent "class" - fabric.Path - fabric.Object.prototype.set.call(this, prop, value); + parentSet.call(this, prop, value); } return this; }, @@ -106,8 +110,7 @@ * @return {Object} object representation of an instance */ toObject: function() { - var _super = fabric.Object.prototype.toObject; - return extend(_super.call(this), { + return extend(toObject.call(this), { paths: invoke(this.getObjects(), 'clone'), sourcePath: this.sourcePath }); @@ -186,8 +189,8 @@ function instantiatePaths(paths) { for (var i = 0, len = paths.length; i < len; i++) { if (!(paths[i] instanceof fabric.Object)) { - var klassName = paths[i].type.camelize().capitalize(); - paths[i] = Canvas[klassName].fromObject(paths[i]); + var klassName = capitalize(camelize(paths[i].type)); + paths[i] = fabric[klassName].fromObject(paths[i]); } } return paths; diff --git a/src/util/dom_event.js b/src/util/dom_event.js index 00b5f5df..5e30312a 100644 --- a/src/util/dom_event.js +++ b/src/util/dom_event.js @@ -143,7 +143,6 @@ fabric.util.addListener = addListener; fabric.util.removeListener = removeListener; - var customEventListeners = { }; function observeEvent(eventName, handler) { @@ -154,16 +153,11 @@ } function fireEvent(eventName, memo) { - if (!customEventListeners[eventName]) return; - for (var i = 0, len = customEventListeners[eventName].length; i < len; i++) { - try { - customEventListeners[eventName][i]({ memo: memo }); - } - catch(err) { - setTimeout(function () { - throw err; - }, 0); - } + var listenersForEvent = customEventListeners[eventName]; + if (!listenersForEvent) return; + for (var i = 0, len = listenersForEvent.length; i < len; i++) { + // avoiding try/catch for perf. reasons + listenersForEvent[i]({ memo: memo }); } }