UNPKG

fabric-pure-browser

Version:

Fabric.js package with no node-specific dependencies (node-canvas, jsdom). The project is published once a day (in case if a new version appears) from 'master' branch of https://github.com/fabricjs/fabric.js repository. You can keep original imports in

106 lines (97 loc) 3.42 kB
(function() { var extend = fabric.util.object.extend, originalSet = 'stateProperties'; /* Depends on `stateProperties` */ function saveProps(origin, destination, props) { var tmpObj = { }, deep = true; props.forEach(function(prop) { tmpObj[prop] = origin[prop]; }); extend(origin[destination], tmpObj, deep); } function _isEqual(origValue, currentValue, firstPass) { if (origValue === currentValue) { // if the objects are identical, return return true; } else if (Array.isArray(origValue)) { if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) { return false; } for (var i = 0, len = origValue.length; i < len; i++) { if (!_isEqual(origValue[i], currentValue[i])) { return false; } } return true; } else if (origValue && typeof origValue === 'object') { var keys = Object.keys(origValue), key; if (!currentValue || typeof currentValue !== 'object' || (!firstPass && keys.length !== Object.keys(currentValue).length) ) { return false; } for (var i = 0, len = keys.length; i < len; i++) { key = keys[i]; // since clipPath is in the statefull cache list and the clipPath objects // would be iterated as an object, this would lead to possible infinite recursion if (key === 'canvas') { continue; } if (!_isEqual(origValue[key], currentValue[key])) { return false; } } return true; } } fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { /** * Returns true if object state (one of its state properties) was changed * @param {String} [propertySet] optional name for the set of property we want to save * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called */ hasStateChanged: function(propertySet) { propertySet = propertySet || originalSet; var dashedPropertySet = '_' + propertySet; if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) { return true; } return !_isEqual(this[dashedPropertySet], this, true); }, /** * Saves state of an object * @param {Object} [options] Object with additional `stateProperties` array to include when saving state * @return {fabric.Object} thisArg */ saveState: function(options) { var propertySet = options && options.propertySet || originalSet, destination = '_' + propertySet; if (!this[destination]) { return this.setupState(options); } saveProps(this, destination, this[propertySet]); if (options && options.stateProperties) { saveProps(this, destination, options.stateProperties); } return this; }, /** * Setups state of an object * @param {Object} [options] Object with additional `stateProperties` array to include when saving state * @return {fabric.Object} thisArg */ setupState: function(options) { options = options || { }; var propertySet = options.propertySet || originalSet; options.propertySet = propertySet; this['_' + propertySet] = { }; this.saveState(options); return this; } }); })();