ice-render 0.0.1 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/event/ICEEvent.ts","../src/event/EventTarget.ts","../src/event/EventBus.ts","../src/ICE_CONSTS.js","../src/nodejs-support/root.js","../src/animation/FrameManager.ts","../node_modules/lodash/_freeGlobal.js","../node_modules/lodash/_root.js","../node_modules/lodash/_Symbol.js","../node_modules/lodash/_getRawTag.js","../node_modules/lodash/_objectToString.js","../node_modules/lodash/_baseGetTag.js","../node_modules/lodash/isArray.js","../node_modules/lodash/isObjectLike.js","../node_modules/lodash/isString.js","../node_modules/lodash/isUndefined.js","../src/animation/Easing.ts","../src/animation/AnimationManager.ts","../src/event/EventDispatcher.ts","../src/event/mouse-event-interceptor.js","../src/renderer/CanvasRenderer.ts","../src/renderer/SVGRenderer.ts","../src/graphic/ICEBoundingRect.ts","../node_modules/lodash/isSymbol.js","../node_modules/lodash/_isKey.js","../node_modules/lodash/isObject.js","../node_modules/lodash/isFunction.js","../node_modules/lodash/_isMasked.js","../node_modules/lodash/_coreJsData.js","../node_modules/lodash/_toSource.js","../node_modules/lodash/_baseIsNative.js","../node_modules/lodash/_getValue.js","../node_modules/lodash/_getNative.js","../node_modules/lodash/_nativeCreate.js","../node_modules/lodash/_hashClear.js","../node_modules/lodash/_hashDelete.js","../node_modules/lodash/_hashGet.js","../node_modules/lodash/_hashHas.js","../node_modules/lodash/_hashSet.js","../node_modules/lodash/_Hash.js","../node_modules/lodash/_listCacheClear.js","../node_modules/lodash/eq.js","../node_modules/lodash/_assocIndexOf.js","../node_modules/lodash/_listCacheDelete.js","../node_modules/lodash/_listCacheGet.js","../node_modules/lodash/_listCacheHas.js","../node_modules/lodash/_listCacheSet.js","../node_modules/lodash/_ListCache.js","../node_modules/lodash/_Map.js","../node_modules/lodash/_mapCacheClear.js","../node_modules/lodash/_isKeyable.js","../node_modules/lodash/_getMapData.js","../node_modules/lodash/_mapCacheDelete.js","../node_modules/lodash/_mapCacheGet.js","../node_modules/lodash/_mapCacheHas.js","../node_modules/lodash/_mapCacheSet.js","../node_modules/lodash/_MapCache.js","../node_modules/lodash/memoize.js","../node_modules/lodash/_memoizeCapped.js","../node_modules/lodash/_stringToPath.js","../node_modules/lodash/_arrayMap.js","../node_modules/lodash/_baseToString.js","../node_modules/lodash/toString.js","../node_modules/lodash/_castPath.js","../node_modules/lodash/_toKey.js","../node_modules/lodash/_baseGet.js","../node_modules/lodash/get.js","../src/graphic/ICEComponent.ts","../src/graphic/ICEPath.ts","../src/graphic/ICEVector.ts","../src/graphic/shape/ICERect.ts","../src/transformation/TransformationHandle.ts","../src/ICE.ts","../src/index.ts"],"sourcesContent":["/**\r\n * 在 ICE 中,所有事件都会被转化成 ICEEvent 进行处理。\r\n * ICEEvent 用来模拟 W3C 定义的 Event 接口,ICE 自定义的事件也使用此实现,事件对象上能获取到的属性不同。\r\n * 从原始 DOM 事件转发出来的 ICEEvent 实例包含 Event 接口上所定义的所有属性,ICE 内部代码创建的 ICEEvent 实例上只包含很少的自定义属性。\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Event\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEEvent {\r\n constructor(evt = {}) {\r\n //FIXME:事件对象的属性拷贝需要更加细致的控制\r\n for (let p in evt) {\r\n this[p] = evt[p];\r\n }\r\n }\r\n}\r\nexport default ICEEvent;\r\n","import ICEEvent from './ICEEvent';\r\n/**\r\n * Canvas 内部的对象默认没有事件机制,模仿 W3C 定义的 EventTaregt 接口,为 Canvas 内部的图形添加事件机制。\r\n * 部分API 名称模仿 jQuery。\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass EventTarget {\r\n constructor(props) {\r\n this.listeners = {};\r\n this.suspendedEventNames = [];\r\n //TODO:some props?\r\n }\r\n on(eventName, fn) {\r\n //TODO:support event array using isArrayLikeObject from lodash.\r\n if (!this.listeners[eventName]) {\r\n this.listeners[eventName] = [];\r\n }\r\n if (!this.listeners[eventName].includes(fn)) {\r\n this.listeners[eventName].push(fn);\r\n }\r\n }\r\n off(eventName, fn) {\r\n if (!this.listeners[eventName])\r\n return false;\r\n if (!fn)\r\n this.listeners[eventName] = []; //clear all callbacks.\r\n if (!this.listeners[eventName].includes(fn))\r\n return false;\r\n this.listeners.splice(this.listeners[eventName].findIndex(fn), 1);\r\n return true;\r\n }\r\n once(eventName, fn) {\r\n this.on(eventName, (evt) => {\r\n this.off(eventName, fn);\r\n fn.apply(evt);\r\n });\r\n }\r\n trigger(eventName, originalEvent) {\r\n if (!this.listeners[eventName])\r\n return false;\r\n if (this.suspendedEventNames.includes(eventName))\r\n return false;\r\n //DOM 事件和代码触发的事件都会被转换成 ICEEvent\r\n let iceEvent;\r\n if (originalEvent) {\r\n iceEvent = new ICEEvent(originalEvent);\r\n iceEvent.originalEvent = originalEvent;\r\n }\r\n else {\r\n iceEvent = new ICEEvent({\r\n type: eventName,\r\n timeStamp: new Date().getTime(),\r\n });\r\n }\r\n this.listeners[eventName].forEach((cb) => {\r\n cb(iceEvent);\r\n });\r\n return true;\r\n }\r\n suspend(eventName, fn) {\r\n if (eventName && !this.suspendedEventNames.includes(eventName)) {\r\n this.suspendedEventNames.push(eventName);\r\n }\r\n if (fn) {\r\n fn.prototype.suspended = true;\r\n }\r\n }\r\n resume(eventName, fn) {\r\n if (eventName && this.suspendedEventNames.includes(eventName)) {\r\n this.suspendedEventNames.splice(this.suspendedEventNames.findIndex(eventName), 1);\r\n }\r\n if (fn) {\r\n fn.prototype.suspended = false;\r\n }\r\n }\r\n purge() {\r\n this.listeners = {};\r\n }\r\n}\r\n//模拟 W3C 的 EventTarget 接口\r\nEventTarget.prototype.addEventListener = EventTarget.prototype.on;\r\nEventTarget.prototype.removeEventListener = EventTarget.prototype.off;\r\nEventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;\r\nexport default EventTarget;\r\n","import EventTarget from './EventTarget';\r\n/**\r\n * @class EventTarget\r\n * EventBus, global singleton.\r\n * EventBus 是 EventTarget 接口的实现类,ICE 内部的全局事件总线。\r\n * EventBus 的用途:\r\n * - 把外层 DOM 上的原生时间转发到 canvas 内部(mouse/keyboard/touch)\r\n * - requestAnimationFrame 触发的事件\r\n * - ICE 内部需要使用事件总线的实现\r\n *\r\n * @singleton\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass _EventBus extends EventTarget {\r\n constructor(props = {}) {\r\n super();\r\n }\r\n}\r\nexport const EventBus = new _EventBus();\r\n","const ICE_CONSTS = {\r\n ICE_FRAME_EVENT: 'ICE_FRAME_EVENT',\r\n BEFORE_RENDER: 'BEFORE_RENDER',\r\n AFTER_RENDER: 'AFTER_RENDER',\r\n CLICK_ITEM: 'CLICK_ITEM',\r\n};\r\n\r\nexport default ICE_CONSTS;\r\n","/**\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nconst root = window || global;\r\nexport default root;\r\n","import { EventBus } from '../event/EventBus';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\nimport root from '../nodejs-support/root';\r\n/**\r\n * 帧频控制器,全局单例,请勿创建多个实例。\r\n * 在浏览器中,当动画帧频过高时,会导致 CPU 使用率飙升,页面会卡顿。\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\n//TODO:Move these to global config.\r\n//TODO:当帧率小于12时,自动跳帧\r\n//TODO:控制帧率\r\nconst MAX_FRAME_RATE = 60;\r\nconst MIN_FRAME_RATE = 12;\r\nconst DEFAULT_FRAME_RATE = 24;\r\nlet sysInitTime = Date.now(); //整个 ICE 系统启动的事件,计算动画补间时需要用到这个时间点\r\nfunction frameCallback() {\r\n EventBus.trigger(ICE_CONSTS.ICE_FRAME_EVENT);\r\n root.requestAnimationFrame(frameCallback);\r\n}\r\nfunction start() {\r\n //TODO:为 Node 平台自定义一个 requestAnimationFrame 函数,签名、参数、调用方式全部相同。\r\n root.requestAnimationFrame(frameCallback);\r\n}\r\nfunction stop() {\r\n console.log('stop animation...');\r\n}\r\nfunction pause() {\r\n console.log('pause animation...');\r\n}\r\nfunction resume() {\r\n console.log('resume animation...');\r\n}\r\nexport default { start, stop, pause, resume, sysInitTime };\r\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nmodule.exports = isUndefined;\n","/**\r\n * 一组缓动工具函数\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nconst Easing = {\r\n /**\r\n * 线性变化\r\n * @param from 起始值\r\n * @param to 终止值\r\n * @param duration 持续时间,ms\r\n * @param startTime 动画开始时间\r\n */\r\n linear: function (from, to, duration, startTime) {\r\n let deltaT = Date.now() - startTime;\r\n let deltaValue = to - from;\r\n return from + (deltaValue / duration) * deltaT;\r\n },\r\n easeInQuad: function (from, to, duration, startTime) {\r\n let deltaT = Date.now() - startTime;\r\n let deltaValue = to - from;\r\n return from + (deltaValue / duration) * (deltaT / duration) * deltaT;\r\n },\r\n};\r\nexport default Easing;\r\n","import isString from 'lodash/isString';\r\nimport isUndefined from 'lodash/isUndefined';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\nimport { EventBus } from './../event/EventBus';\r\nimport Easing from './Easing';\r\n/**\r\n * TODO:singleton???\r\n * @class AnimationManager\r\n * 全局动画管理器\r\n * @singleton\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass AnimationManager {\r\n constructor() {\r\n this.animationMap = new Map(); //所有需要执行动画的元素都会被自动存入此列表中\r\n }\r\n start() {\r\n EventBus.on(ICE_CONSTS.ICE_FRAME_EVENT, (evt) => {\r\n this.animationMap.forEach((el) => {\r\n this.tween(el);\r\n });\r\n });\r\n return this;\r\n }\r\n //FIXME:\r\n stop() { }\r\n //TODO:处理无限循环播放的情况,处理播放次数的情况\r\n //TODO:每一个属性变化的持续时间不同,需要做同步处理,所有动画都执行完毕之后,需要把对象从动画列表中删除\r\n tween(el) {\r\n let newState = {};\r\n let animations = el.props.animations;\r\n for (let key in animations) {\r\n let animation = animations[key];\r\n let from = animation.from;\r\n let to = animation.to;\r\n let duration = animation.duration;\r\n if (isUndefined(animation.startTime)) {\r\n animation.startTime = Date.now();\r\n }\r\n if (isUndefined(animation.easing)) {\r\n animation.easing = 'linear';\r\n }\r\n let newValue = Easing[animation.easing](from, to, duration, animation.startTime);\r\n if (newValue > to) {\r\n newValue = to;\r\n }\r\n newState[key] = Math.floor(newValue); //使用整数个像素点\r\n }\r\n el.setState({ ...newState });\r\n return el;\r\n }\r\n add(component) {\r\n this.animationMap.set(component.id, component);\r\n }\r\n remove(el) {\r\n if (isString(el)) {\r\n this.animationMap.delete(el);\r\n }\r\n else {\r\n this.animationMap.delete(el.id);\r\n }\r\n }\r\n}\r\nexport default AnimationManager;\r\n","import ICE_CONSTS from '../ICE_CONSTS';\r\nimport { EventBus } from './EventBus';\r\n/**\r\n * TODO:singleton???\r\n * 事件转发器\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass EventDispatcher {\r\n constructor(ICE) {\r\n this.ICE = ICE;\r\n this.renderMap = ICE.renderMap;\r\n this.ctx = ICE.ctx;\r\n }\r\n start() {\r\n EventBus.on('click', (evt) => {\r\n this.findClickElement(evt);\r\n EventBus.trigger(ICE_CONSTS.CLICK_ITEM, evt);\r\n });\r\n return this;\r\n }\r\n /**\r\n * 找到被点击的对象,用代码触发 click 事件。\r\n * 在点击状态下,每次只能点击一个对象。\r\n * @param evt\r\n */\r\n findClickElement(evt) {\r\n let x = evt.clientX - this.ICE.canvasBoundingClientRect.left;\r\n let y = evt.clientY - this.ICE.canvasBoundingClientRect.top;\r\n let els = Array.from(this.renderMap.values());\r\n for (let i = 0; i < els.length; i++) {\r\n let el = els[i];\r\n if (el.path2D) {\r\n let flag1 = this.ctx.isPointInPath(el.path2D, x, y);\r\n let flag2 = this.ctx.isPointInStroke(el.path2D, x, y);\r\n if ((flag1 || flag2) && !el.silent) {\r\n evt.target = el;\r\n el.trigger('click', evt);\r\n return el;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default EventDispatcher;\r\n","import { EventBus } from '../event/EventBus';\r\nimport root from '../nodejs-support/root';\r\n\r\nconst mouseEvents = [\r\n 'click',\r\n 'dbclick',\r\n 'mousedown',\r\n 'mouseup',\r\n 'mousemove',\r\n 'mousemove',\r\n 'mouseenter',\r\n 'mouseleave',\r\n 'mouseout',\r\n 'mouseover',\r\n 'contextmenu',\r\n 'mousewheel',\r\n];\r\n\r\nif (root.addEventListener) {\r\n mouseEvents.forEach((item) => {\r\n //TODO:不同浏览器版本,以及 NodeJS 环境兼容性测试\r\n root.document.addEventListener(item, (evt) => {\r\n EventBus.trigger(evt.type, evt);\r\n });\r\n });\r\n}\r\n\r\nexport default mouseEvents;\r\n","import { EventBus } from '..';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\n/**\r\n * TODO:global singleton\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass CanvasRenderer {\r\n constructor(ICE) {\r\n this.ICE = ICE;\r\n this.renderMap = ICE.renderMap;\r\n this.ctx = ICE.ctx;\r\n }\r\n start() {\r\n console.log('Starting canvas renderer...');\r\n EventBus.on(ICE_CONSTS.ICE_FRAME_EVENT, (evt) => {\r\n //FIXME:fix this when using increamental rendering\r\n //FIXME:动画有闪烁\r\n this.ctx.clearRect(0, 0, this.ICE.canvasWidth, this.ICE.canvasHeight);\r\n if (this.renderMap && this.renderMap.size) {\r\n this.renderMap.forEach((el) => {\r\n !el.isRendering && el.render(this.ctx);\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n stop() {\r\n throw new Error('Method not implemented.');\r\n }\r\n}\r\nexport default CanvasRenderer;\r\n","/**\r\n * TODO:global singleton\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass SVGRenderer {\r\n constructor() { }\r\n start() {\r\n console.log('Starting SVG renderer...');\r\n }\r\n stop() {\r\n throw new Error('Method not implemented.');\r\n }\r\n}\r\nexport default SVGRenderer;\r\n","import { mat3 } from 'gl-matrix';\r\n/**\r\n * @class ICEBoundingRect 边界矩形\r\n *\r\n * 边界矩形总是绘制在全局坐标系中。\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMRect\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEBoundingRect {\r\n constructor(props = {}) {\r\n this.left = 0;\r\n this.top = 0;\r\n this.right = 0;\r\n this.bottom = 0;\r\n this.width = 0;\r\n this.height = 0;\r\n this.originalPoints = [];\r\n this.transformedPoints = [];\r\n let { top = 0, left = 0, width = 0, height = 0 } = props;\r\n this.top = top;\r\n this.left = left;\r\n this.width = width;\r\n this.height = height;\r\n this.right = left + width;\r\n this.bottom = top + height;\r\n //四点法,原始边界矩形的4个顶点\r\n this.originalPoints = [\r\n [this.left, this.top, 1],\r\n [this.left + this.width, this.top, 1],\r\n [this.left + this.width, this.top + this.height, 1],\r\n [this.left, this.top + this.height, 1],\r\n ];\r\n this.transformedPoints = [\r\n [this.left, this.top, 1],\r\n [this.left + this.width, this.top, 1],\r\n [this.left + this.width, this.top + this.height, 1],\r\n [this.left, this.top + this.height, 1],\r\n ];\r\n }\r\n /**\r\n * 边界矩形合并\r\n * @param target\r\n * @returns\r\n */\r\n union(target) {\r\n let { top, left, right, bottom, width, height } = this;\r\n top = target.top < top ? target.top : top;\r\n left = target.left < left ? target.left : left;\r\n bottom = target.bottom > bottom ? target.bottom : bottom;\r\n right = target.right > right ? target.right : right;\r\n width = right - left;\r\n height = bottom - top;\r\n return new ICEBoundingRect({ top, left, width, height });\r\n }\r\n transform(mat) {\r\n let result = [];\r\n for (let i = 0; i < this.originalPoints.length; i++) {\r\n result.push(mat3.mul([], mat, this.originalPoints[i]));\r\n }\r\n this.transformedPoints = result;\r\n return this;\r\n }\r\n}\r\nexport default ICEBoundingRect;\r\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","import { mat3 } from 'gl-matrix';\r\nimport get from 'lodash/get';\r\nimport EventTarget from '../event/EventTarget';\r\n/**\r\n * @class ICEComponent\r\n * Canvas 内部所有组件的根类\r\n * TODO:全部采用 Path2D 的方式绘制图形,不采用 CanvasRenderingContext2D 上定义的绘制图形的方法\r\n * TODO:定义图形对象的完整数据结构,包含path/style/animation/transformation\r\n * TODO:动画运行过程中不允许选中,不能进行交互\r\n * @abstract\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEComponent extends EventTarget {\r\n constructor(props = {}) {\r\n super(props);\r\n //FIXME:生成随机ID有问题,FIX\r\n //sha256(Math.random() * 100000000).toString();\r\n this.id = 'ICE_' + Math.floor(Math.random() * 10000000000);\r\n this.zIndex = 0;\r\n this.silent = false; //silent=true 将不会触发任何事件\r\n this.isRendering = false;\r\n //Default animations.\r\n this.animations = {};\r\n //Default transformations.\r\n this.transformations = {\r\n translate: [0, 0],\r\n scale: [1, 1],\r\n skew: [0, 0],\r\n rotate: 0,\r\n };\r\n //3阶单位矩阵,请勿修改此矩阵的值\r\n this.mat3Identity = [1, 0, 0, 0, 1, 0, 0, 0, 1];\r\n /**\r\n * Default props.\r\n * Do NOT modify props, use state for instead.\r\n * 在二维画布上,可视对象一定存在 x/y/width/height 这4个属性。\r\n */\r\n this.props = {\r\n left: 0,\r\n top: 0,\r\n animations: this.animations,\r\n transformations: this.transformations,\r\n transformationMatrix: [...this.mat3Identity],\r\n };\r\n this.state = { ...this.props };\r\n this.props = { ...this.props, ...props };\r\n this.state = { ...this.props };\r\n this.animations = this.props.animations;\r\n this.transformations = this.props.transformations;\r\n // this.id = 'ICE_' + sha256(Math.random() * 100000000).toString();\r\n this.zIndex++; //TODO:fix zIndex\r\n }\r\n setState(newState) {\r\n this.state = { ...this.state, ...newState };\r\n }\r\n /**\r\n * @param ctx CanvasRenderingContext2D\r\n */\r\n applyStrokeStyle(ctx) {\r\n console.log('apply stroke style...');\r\n }\r\n /**\r\n * @param ctx CanvasRenderingContext2D\r\n */\r\n applyFillStyle(ctx) {\r\n console.log('apply fill style...');\r\n }\r\n /**\r\n * 复合变换矩阵\r\n * 矩阵变换顺序:错切->旋转->缩放->平移\r\n */\r\n composeMatrix() {\r\n //skew\r\n let skewMat = [...this.mat3Identity];\r\n if (get(this, 'transformations.skew')) {\r\n skewMat[3] = get(this, 'transformations.skew.0');\r\n skewMat[1] = get(this, 'transformations.skew.1');\r\n }\r\n //rotate\r\n let rotateMat = [...this.mat3Identity];\r\n if (get(this, 'transformations.rotate')) {\r\n let angle = get(this, 'transformations.rotate');\r\n let radian = (angle * Math.PI) / 180;\r\n rotateMat[0] = Math.cos(radian);\r\n rotateMat[1] = Math.sin(radian);\r\n rotateMat[3] = -Math.sin(radian);\r\n rotateMat[4] = Math.cos(radian);\r\n }\r\n //scale\r\n let scaleMat = [...this.mat3Identity];\r\n if (get(this, 'transformations.scale')) {\r\n scaleMat[0] = get(this, 'transformations.scale.0');\r\n scaleMat[4] = get(this, 'transformations.scale.1');\r\n }\r\n //translate [[1,0,0][0,1,0][dx,dy,1]]\r\n let translateMat = [...this.mat3Identity];\r\n translateMat[6] = this.state.left;\r\n translateMat[7] = this.state.top;\r\n if (get(this, 'transformations.translate')) {\r\n translateMat[6] += get(this, 'transformations.translate.0');\r\n translateMat[7] += get(this, 'transformations.translate.1');\r\n }\r\n //依次左乘\r\n let result = mat3.mul([], rotateMat, skewMat);\r\n result = mat3.mul([], scaleMat, result);\r\n result = mat3.mul([], translateMat, result);\r\n //缓存当前的变换矩阵\r\n this.state.transformationMatrix = [...result];\r\n return result;\r\n }\r\n /**\r\n * TODO:改成 abstract?\r\n * @returns\r\n */\r\n toJSON() {\r\n return '{}';\r\n }\r\n /**\r\n * TODO:改成 abstract\r\n * @returns\r\n */\r\n fromJSON(jsonStr) {\r\n return {};\r\n }\r\n}\r\nexport default ICEComponent;\r\n","import { mat3 } from 'gl-matrix';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\nimport ICEBoundingRect from './ICEBoundingRect';\r\nimport ICEComponent from './ICEComponent';\r\n/**\r\n * @class ICEPath\r\n * 路径由一系列点构成。\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEPath extends ICEComponent {\r\n constructor(props = {}) {\r\n super(props);\r\n this.dots = [];\r\n this.path2D = new Path2D();\r\n this.dots = this.props.dots ? this.props.dots : [];\r\n this.state = { ...this.state, dots: this.dots };\r\n }\r\n /**\r\n * @overwrite\r\n * @param newState\r\n */\r\n setState(newState) {\r\n super.setState(newState);\r\n this.dots = [...this.state.dots];\r\n }\r\n /**\r\n * @param ctx CanvasRenderingContext2D\r\n */\r\n render(ctx) {\r\n this.isRendering = true;\r\n this.trigger(ICE_CONSTS.BEFORE_RENDER);\r\n ctx.strokeStyle = '';\r\n ctx.fillStyle = 'red';\r\n ctx.beginPath();\r\n this.createPath();\r\n ctx.stroke(this.path2D);\r\n ctx.fill(this.path2D);\r\n ctx.restore();\r\n this.trigger(ICE_CONSTS.AFTER_RENDER);\r\n this.isRendering = false;\r\n }\r\n createPath() {\r\n this.calcDots();\r\n this.applyTransform();\r\n this.doCreatePath();\r\n return this.path2D;\r\n }\r\n /**\r\n * 全部相对于 [0,0] 点,在 [0,0] 点计算完成之后再用变换矩阵左乘\r\n * @returns\r\n */\r\n calcDots() {\r\n return this.state.dots;\r\n }\r\n doCreatePath() {\r\n this.path2D = new Path2D();\r\n for (let i = 0; i < this.state.dots.length; i++) {\r\n const vertex = this.state.dots[i];\r\n if (i === 0) {\r\n this.path2D.moveTo(vertex.x, vertex.y);\r\n }\r\n else {\r\n this.path2D.lineTo(vertex.x, vertex.y);\r\n }\r\n }\r\n this.path2D.closePath();\r\n return this.path2D;\r\n }\r\n applyTransform() {\r\n let matrix = this.composeMatrix();\r\n this.state.dots.forEach((v) => {\r\n let transformed = mat3.mul([], matrix, [v.x, v.y, 1, 0, 0, 0, 0, 0, 0]);\r\n v.x = Math.floor(transformed[0]); //像素点使用整数\r\n v.y = Math.floor(transformed[1]); //像素点使用整数\r\n });\r\n }\r\n getCurrentBoundingRect() {\r\n let minX = 0;\r\n let minY = 0;\r\n let maxX = 0;\r\n let maxY = 0;\r\n for (let i = 0; i < this.state.dots.length; i++) {\r\n let v = this.state.dots[i];\r\n if (i === 0) {\r\n minX = v.x;\r\n maxX = v.x;\r\n minY = v.y;\r\n maxY = v.y;\r\n }\r\n else {\r\n if (v.x < minX) {\r\n minX = v.x;\r\n }\r\n if (v.x > maxX) {\r\n maxX = v.x;\r\n }\r\n if (v.y < minY) {\r\n minY = v.y;\r\n }\r\n if (v.y > maxY) {\r\n maxY = v.y;\r\n }\r\n }\r\n }\r\n return new ICEBoundingRect({ left: minX, top: minY, width: Math.floor(maxX - minX), height: Math.floor(maxY - minY) });\r\n }\r\n getTransformedBoundingRect() {\r\n const temp = new ICEBoundingRect({ left: 0, top: 0, width: this.state.width, height: this.state.height }); //width, height 可能会因为动画效果发生变化\r\n const mat = this.state.transformationMatrix;\r\n return temp.transform(mat);\r\n }\r\n}\r\nexport default ICEPath;\r\n","/**\r\n * 二维向量,笛卡尔坐标系。\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEVector {\r\n constructor(v = { x: 0, y: 0 }) {\r\n this.x = 0;\r\n this.y = 0;\r\n this.x = v.x;\r\n this.y = v.y;\r\n }\r\n /**\r\n * 向量相加,生成新的向量对象。\r\n * @param v\r\n * @returns\r\n */\r\n add(v) {\r\n let newVector = new ICEVector();\r\n newVector.x = this.x + v.x;\r\n newVector.y = this.y + v.y;\r\n return newVector;\r\n }\r\n /**\r\n * 向量相减,生成新的向量。\r\n * @param v\r\n * @returns\r\n */\r\n sub(v) {\r\n let newVector = new ICEVector();\r\n newVector.x = this.x - v.x;\r\n newVector.y = this.y - v.y;\r\n return newVector;\r\n }\r\n mul(v) {\r\n //TODO:实现向量叉乘\r\n return this;\r\n }\r\n dot(v) {\r\n //TODO:实现向量点乘\r\n return this;\r\n }\r\n}\r\nexport default ICEVector;\r\n","import ICEPath from '../ICEPath';\r\nimport ICEVector from '../ICEVector';\r\n/**\r\n * @class ICERect 矩形\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICERect extends ICEPath {\r\n constructor(props = { width: 10, height: 10 }) {\r\n super(props);\r\n }\r\n calcDots() {\r\n let point1 = new ICEVector({ x: 0, y: 0 });\r\n let point2 = new ICEVector({ x: this.state.width, y: 0 });\r\n let point3 = new ICEVector({ x: this.state.width, y: this.state.height });\r\n let point4 = new ICEVector({ x: 0, y: this.state.height });\r\n this.dots = [point1, point2, point3, point4];\r\n return this.dots;\r\n }\r\n}\r\nexport default ICERect;\r\n","import { EventBus } from '../event/EventBus';\r\nimport ICEPath from '../graphic/ICEPath';\r\nimport ICEVector from '../graphic/ICEVector';\r\nimport ICERect from '../graphic/shape/ICERect';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\n/**\r\n * TODO:\r\n * 单选模式下,BoundingRect 跟随对象的 TransformationMatrix\r\n * 多选模式下, BoundingRect永远不变换。\r\n * @see http://fabricjs.com/bounding-rectangle\r\n * @class TransformationHandle 可视化的变换手柄\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass TransformationHandle {\r\n constructor(ICE) {\r\n this.selectionList = [];\r\n this.ICE = ICE;\r\n this.selectionRect = new ICERect({\r\n left: 0,\r\n top: 0,\r\n width: 10,\r\n height: 10,\r\n });\r\n this.ICE.addToRenderMap(this.selectionRect);\r\n this.selectionPath = new ICEPath();\r\n this.ICE.addToRenderMap(this.selectionPath);\r\n }\r\n start() {\r\n EventBus.on(ICE_CONSTS.CLICK_ITEM, (evt) => {\r\n if (evt.ctrlKey) {\r\n this.selectionList.push(evt.target);\r\n }\r\n else {\r\n this.selectionList = [evt.target];\r\n }\r\n this.drawSelectionRect();\r\n });\r\n return this;\r\n }\r\n drawSelectionRect() {\r\n let minX = 0;\r\n let minY = 0;\r\n let maxX = 0;\r\n let maxY = 0;\r\n for (let i = 0; i < this.selectionList.length; i++) {\r\n let boundingRect = this.selectionList[i].getCurrentBoundingRect();\r\n console.log(boundingRect);\r\n if (i === 0) {\r\n minX = boundingRect.left;\r\n minY = boundingRect.top;\r\n maxX = boundingRect.right;\r\n maxY = boundingRect.bottom;\r\n }\r\n else {\r\n if (boundingRect.left < minX) {\r\n minX = boundingRect.left;\r\n }\r\n if (boundingRect.top < minY) {\r\n minY = boundingRect.top;\r\n }\r\n if (boundingRect.right > maxX) {\r\n maxX = boundingRect.right;\r\n }\r\n if (boundingRect.bottom > maxY) {\r\n maxY = boundingRect.bottom;\r\n }\r\n }\r\n //变换之后的边界矩形\r\n console.log(this.selectionList[i].getTransformedBoundingRect());\r\n let transformedPoints = this.selectionList[i].getTransformedBoundingRect().transformedPoints;\r\n let dots = [];\r\n for (let j = 0; j < transformedPoints.length; j++) {\r\n const p = transformedPoints[j];\r\n dots.push(new ICEVector({ x: p[0] - 10, y: p[1] - 10 })); //FIXME: -10 for test\r\n }\r\n this.selectionPath.setState({ dots: dots });\r\n }\r\n this.selectionRect.setState({\r\n left: minX,\r\n top: minY,\r\n width: maxX - minX,\r\n height: maxY - minY,\r\n });\r\n }\r\n //FIXME:\r\n stop() { }\r\n}\r\nexport default TransformationHandle;\r\n","import isString from 'lodash/isString';\r\nimport pkg from '../package.json';\r\nimport AnimationManager from './animation/AnimationManager';\r\nimport EventDispatcher from './event/EventDispatcher';\r\nimport EventTarget from './event/EventTarget';\r\nimport './event/keyboard-event-interceptor.js';\r\nimport './event/mouse-event-interceptor.js';\r\nimport './event/touch-event-interceptor.js';\r\nimport CanvasRenderer from './renderer/CanvasRenderer';\r\nimport SVGRenderer from './renderer/SVGRenderer';\r\nimport TransformationHandle from './transformation/TransformationHandle';\r\nconst renderer = {\r\n ICE_CANVAS_RENDERER: CanvasRenderer,\r\n ICE_SVG_RENDERER: SVGRenderer,\r\n};\r\n/**\r\n * ICE: interactive canvas engine.\r\n * 全局单例\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass _ICE extends EventTarget {\r\n constructor(props = {}) {\r\n super();\r\n this.version = pkg.version;\r\n //所有需要在 canvas 中渲染的对象都在此结构中 TODO:为了支持 zIndex 特性,需要改成数组,有堆叠顺序\r\n this.renderMap = new Map();\r\n this.canvasWidth = 0;\r\n this.canvasHeight = 0;\r\n }\r\n /**\r\n * @param ctx DOM id or CanvasContext\r\n */\r\n init(ctx) {\r\n if (!ctx) {\r\n throw new Error('init() failed...');\r\n }\r\n if (this.ctx === ctx) {\r\n //FIXME:\r\n throw new Error('同一个 canvas 实例只能 init 一次...');\r\n }\r\n //FIXME:防止 init 方法被调用多次\r\n if (isString(ctx)) {\r\n this.canvasEl = this.root.document.getElementById(ctx);\r\n this.canvasWidth = this.canvasEl.width;\r\n this.canvasHeight = this.canvasEl.height;\r\n this.canvasBoundingClientRect = this.canvasEl.getBoundingClientRect();\r\n this.ctx = this.canvasEl.getContext('2d');\r\n }\r\n else {\r\n this.ctx = ctx;\r\n }\r\n //Create a set of Managers.\r\n this.eventDispatcher = new EventDispatcher(this).start();\r\n this.animationManager = new AnimationManager().start();\r\n this.currentRenderer = new CanvasRenderer(this).start();\r\n this.transformationHandle = new TransformationHandle(this).start();\r\n }\r\n registerRenderer(name, rendererClass) {\r\n renderer[name] = rendererClass;\r\n }\r\n setRenderer(name) {\r\n this.currentRenderer = renderer[name];\r\n }\r\n addToRenderMap(component) {\r\n this.renderMap.set(component.id, component);\r\n if (component.props.animations) {\r\n this.animationManager.add(component);\r\n }\r\n }\r\n removeFromRenderMap(obj) {\r\n //TODO:停止动画效果\r\n //TODO:停止变换\r\n //TODO:清理所有事件监听,然后再从结构中删除\r\n }\r\n clearRenderMap() {\r\n //TODO:停止所有对象的动画效果\r\n //TODO:停止变换\r\n //TODO:清理所有事件监听,然后再从结构中删除\r\n }\r\n toJSON() {\r\n return '{}';\r\n }\r\n fromJSON(jsonStr) {\r\n return {};\r\n }\r\n}\r\nexport const ICE = new _ICE();\r\n","import FrameController from './animation/FrameManager';\r\nimport { ICE } from './ICE';\r\nimport root from './nodejs-support/root';\r\nroot.ICE = ICE;\r\nICE.root = root;\r\nFrameController.start();\r\nexport * from './event/EventBus';\r\nexport * from './graphic/ICEBoundingRect';\r\nexport * from './graphic/ICEComponent';\r\nexport * from './graphic/ICEImage';\r\nexport * from './graphic/ICEText';\r\nexport * from './graphic/line/ICEBezier';\r\nexport * from './graphic/line/ICELine';\r\nexport * from './graphic/shape/ICEIsogon';\r\nexport * from './graphic/shape/ICERect';\r\nexport * from './graphic/shape/ICEStar';\r\nexport default { root, ICE };\r\n"],"names":["ICEEvent","evt","p","EventTarget","props","listeners","suspendedEventNames","eventName","fn","this","includes","push","splice","findIndex","on","_this","off","apply","originalEvent","iceEvent","type","timeStamp","Date","getTime","forEach","cb","prototype","suspended","addEventListener","removeEventListener","dispatchEvent","trigger","EventBus","ICE_CONSTS","root","window","global","frameCallback","requestAnimationFrame","start","stop","console","log","pause","resume","sysInitTime","now","Object","freeSelf","self","freeGlobal","Function","Symbol","objectProto","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","value","isOwn","call","tag","unmasked","e","result","getRawTag","objectToString","Array","isArray","isObjectLike","baseGetTag","Easing","linear","from","to","duration","startTime","easeInQuad","deltaT","AnimationManager","animationMap","Map","el","tween","newState","animations","key","animation","isUndefined","easing","newValue","Math","floor","setState","component","set","id","isString","EventDispatcher","ICE","renderMap","ctx","findClickElement","x","clientX","canvasBoundingClientRect","left","y","clientY","top","els","values","i","length","path2D","flag1","isPointInPath","flag2","isPointInStroke","silent","target","item","document","CanvasRenderer","clearRect","canvasWidth","canvasHeight","size","isRendering","render","Error","SVGRenderer","ICEBoundingRect","right","bottom","width","height","originalPoints","transformedPoints","mat","mat3","mul","reIsDeepProp","reIsPlainProp","object","isSymbol","test","uid","isObject","maskSrcKey","exec","coreJsData","keys","IE_PROTO","func","funcToString","reIsHostCtor","funcProto","reIsNative","RegExp","replace","isMasked","isFunction","toSource","getValue","baseIsNative","getNative","__data__","nativeCreate","has","data","Hash","entries","index","clear","entry","hashClear","hashDelete","get","hashGet","hashHas","hashSet","other","array","eq","assocIndexOf","pop","ListCache","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","hash","map","string","isKeyable","getMapData","MapCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","memoize","resolver","TypeError","memoized","args","arguments","cache","Cache","rePropName","reEscapeChar","memoizeCapped","charCodeAt","match","number","quote","subString","iteratee","symbolProto","symbolToString","baseToString","arrayMap","isKey","stringToPath","path","castPath","toKey","defaultValue","baseGet","ICEComponent","random","zIndex","transformations","translate","scale","skew","rotate","mat3Identity","transformationMatrix","state","skewMat","rotateMat","radian","PI","cos","sin","scaleMat","translateMat","jsonStr","ICEPath","dots","Path2D","strokeStyle","fillStyle","beginPath","createPath","stroke","fill","restore","calcDots","applyTransform","doCreatePath","vertex","moveTo","lineTo","closePath","matrix","composeMatrix","v","transformed","minX","minY","maxX","maxY","temp","transform","ICEVector","newVector","ICERect","point1","point2","point3","point4","TransformationHandle","selectionList","selectionRect","addToRenderMap","selectionPath","ctrlKey","drawSelectionRect","boundingRect","getCurrentBoundingRect","getTransformedBoundingRect","j","renderer","ICE_CANVAS_RENDERER","ICE_SVG_RENDERER","version","pkg","canvasEl","getElementById","getBoundingClientRect","getContext","eventDispatcher","animationManager","currentRenderer","transformationHandle","name","rendererClass","add","obj","FrameController"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/event/ICEEvent.ts","../src/event/EventTarget.ts","../src/event/EventBus.ts","../src/ICE_CONSTS.js","../src/nodejs-support/root.js","../src/animation/FrameManager.ts","../node_modules/lodash/_freeGlobal.js","../node_modules/lodash/_root.js","../node_modules/lodash/_Symbol.js","../node_modules/lodash/_getRawTag.js","../node_modules/lodash/_objectToString.js","../node_modules/lodash/_baseGetTag.js","../node_modules/lodash/isArray.js","../node_modules/lodash/isObjectLike.js","../node_modules/lodash/isString.js","../node_modules/lodash/isUndefined.js","../src/animation/Easing.ts","../src/animation/AnimationManager.ts","../src/event/EventDispatcher.ts","../src/event/mouse-event-interceptor.js","../src/renderer/CanvasRenderer.ts","../src/renderer/SVGRenderer.ts","../src/graphic/ICEBoundingRect.ts","../node_modules/lodash/isSymbol.js","../node_modules/lodash/_isKey.js","../node_modules/lodash/isObject.js","../node_modules/lodash/isFunction.js","../node_modules/lodash/_isMasked.js","../node_modules/lodash/_coreJsData.js","../node_modules/lodash/_toSource.js","../node_modules/lodash/_baseIsNative.js","../node_modules/lodash/_getValue.js","../node_modules/lodash/_getNative.js","../node_modules/lodash/_nativeCreate.js","../node_modules/lodash/_hashClear.js","../node_modules/lodash/_hashDelete.js","../node_modules/lodash/_hashGet.js","../node_modules/lodash/_hashHas.js","../node_modules/lodash/_hashSet.js","../node_modules/lodash/_Hash.js","../node_modules/lodash/_listCacheClear.js","../node_modules/lodash/eq.js","../node_modules/lodash/_assocIndexOf.js","../node_modules/lodash/_listCacheDelete.js","../node_modules/lodash/_listCacheGet.js","../node_modules/lodash/_listCacheHas.js","../node_modules/lodash/_listCacheSet.js","../node_modules/lodash/_ListCache.js","../node_modules/lodash/_Map.js","../node_modules/lodash/_mapCacheClear.js","../node_modules/lodash/_isKeyable.js","../node_modules/lodash/_getMapData.js","../node_modules/lodash/_mapCacheDelete.js","../node_modules/lodash/_mapCacheGet.js","../node_modules/lodash/_mapCacheHas.js","../node_modules/lodash/_mapCacheSet.js","../node_modules/lodash/_MapCache.js","../node_modules/lodash/memoize.js","../node_modules/lodash/_memoizeCapped.js","../node_modules/lodash/_stringToPath.js","../node_modules/lodash/_arrayMap.js","../node_modules/lodash/_baseToString.js","../node_modules/lodash/toString.js","../node_modules/lodash/_castPath.js","../node_modules/lodash/_toKey.js","../node_modules/lodash/_baseGet.js","../node_modules/lodash/get.js","../src/graphic/ICEComponent.ts","../src/graphic/ICEPath.ts","../src/graphic/ICEVector.ts","../src/graphic/shape/ICERect.ts","../src/transformation/TransformationHandle.ts","../src/ICE.ts","../src/index.ts"],"sourcesContent":["/**\r\n * 在 ICE 中,所有事件都会被转化成 ICEEvent 进行处理。\r\n * ICEEvent 用来模拟 W3C 定义的 Event 接口,ICE 自定义的事件也使用此实现,事件对象上能获取到的属性不同。\r\n * 从原始 DOM 事件转发出来的 ICEEvent 实例包含 Event 接口上所定义的所有属性,ICE 内部代码创建的 ICEEvent 实例上只包含很少的自定义属性。\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Event\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEEvent {\r\n constructor(evt = {}) {\r\n //FIXME:事件对象的属性拷贝需要更加细致的控制\r\n for (let p in evt) {\r\n this[p] = evt[p];\r\n }\r\n }\r\n}\r\nexport default ICEEvent;\r\n","import ICEEvent from './ICEEvent';\r\n/**\r\n * Canvas 内部的对象默认没有事件机制,模仿 W3C 定义的 EventTaregt 接口,为 Canvas 内部的图形添加事件机制。\r\n * 部分API 名称模仿 jQuery。\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass EventTarget {\r\n constructor(props) {\r\n this.listeners = {};\r\n this.suspendedEventNames = [];\r\n //TODO:some props?\r\n }\r\n on(eventName, fn) {\r\n //TODO:support event array using isArrayLikeObject from lodash.\r\n if (!this.listeners[eventName]) {\r\n this.listeners[eventName] = [];\r\n }\r\n if (!this.listeners[eventName].includes(fn)) {\r\n this.listeners[eventName].push(fn);\r\n }\r\n }\r\n off(eventName, fn) {\r\n if (!this.listeners[eventName])\r\n return false;\r\n if (!fn)\r\n this.listeners[eventName] = []; //clear all callbacks.\r\n if (!this.listeners[eventName].includes(fn))\r\n return false;\r\n this.listeners.splice(this.listeners[eventName].findIndex(fn), 1);\r\n return true;\r\n }\r\n once(eventName, fn) {\r\n this.on(eventName, (evt) => {\r\n this.off(eventName, fn);\r\n fn.apply(evt);\r\n });\r\n }\r\n trigger(eventName, originalEvent) {\r\n if (!this.listeners[eventName])\r\n return false;\r\n if (this.suspendedEventNames.includes(eventName))\r\n return false;\r\n //DOM 事件和代码触发的事件都会被转换成 ICEEvent\r\n let iceEvent;\r\n if (originalEvent) {\r\n iceEvent = new ICEEvent(originalEvent);\r\n iceEvent.originalEvent = originalEvent;\r\n }\r\n else {\r\n iceEvent = new ICEEvent({\r\n type: eventName,\r\n timeStamp: new Date().getTime(),\r\n });\r\n }\r\n this.listeners[eventName].forEach((cb) => {\r\n cb(iceEvent);\r\n });\r\n return true;\r\n }\r\n suspend(eventName, fn) {\r\n if (eventName && !this.suspendedEventNames.includes(eventName)) {\r\n this.suspendedEventNames.push(eventName);\r\n }\r\n if (fn) {\r\n fn.prototype.suspended = true;\r\n }\r\n }\r\n resume(eventName, fn) {\r\n if (eventName && this.suspendedEventNames.includes(eventName)) {\r\n this.suspendedEventNames.splice(this.suspendedEventNames.findIndex(eventName), 1);\r\n }\r\n if (fn) {\r\n fn.prototype.suspended = false;\r\n }\r\n }\r\n purge() {\r\n this.listeners = {};\r\n }\r\n}\r\n//模拟 W3C 的 EventTarget 接口\r\nEventTarget.prototype.addEventListener = EventTarget.prototype.on;\r\nEventTarget.prototype.removeEventListener = EventTarget.prototype.off;\r\nEventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;\r\nexport default EventTarget;\r\n","import EventTarget from './EventTarget';\r\n/**\r\n * @class EventTarget\r\n * EventBus, global singleton.\r\n * EventBus 是 EventTarget 接口的实现类,ICE 内部的全局事件总线。\r\n * EventBus 的用途:\r\n * - 把外层 DOM 上的原生时间转发到 canvas 内部(mouse/keyboard/touch)\r\n * - requestAnimationFrame 触发的事件\r\n * - ICE 内部需要使用事件总线的实现\r\n *\r\n * @singleton\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass _EventBus extends EventTarget {\r\n constructor(props = {}) {\r\n super();\r\n }\r\n}\r\nexport const EventBus = new _EventBus();\r\n","const ICE_CONSTS = {\r\n ICE_FRAME_EVENT: 'ICE_FRAME_EVENT',\r\n BEFORE_RENDER: 'BEFORE_RENDER',\r\n AFTER_RENDER: 'AFTER_RENDER',\r\n CLICK_ITEM: 'CLICK_ITEM',\r\n};\r\n\r\nexport default ICE_CONSTS;\r\n","/**\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nconst root = window || global;\r\nexport default root;\r\n","import { EventBus } from '../event/EventBus';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\nimport root from '../nodejs-support/root';\r\n/**\r\n * 帧频控制器,全局单例,请勿创建多个实例。\r\n * 在浏览器中,当动画帧频过高时,会导致 CPU 使用率飙升,页面会卡顿。\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\n//TODO:Move these to global config.\r\n//TODO:当帧率小于12时,自动跳帧\r\n//TODO:控制帧率\r\nconst MAX_FRAME_RATE = 60;\r\nconst MIN_FRAME_RATE = 12;\r\nconst DEFAULT_FRAME_RATE = 24;\r\nlet sysInitTime = Date.now(); //整个 ICE 系统启动的事件,计算动画补间时需要用到这个时间点\r\nfunction frameCallback() {\r\n EventBus.trigger(ICE_CONSTS.ICE_FRAME_EVENT);\r\n root.requestAnimationFrame(frameCallback);\r\n}\r\nfunction start() {\r\n //TODO:为 Node 平台自定义一个 requestAnimationFrame 函数,签名、参数、调用方式全部相同。\r\n root.requestAnimationFrame(frameCallback);\r\n}\r\nfunction stop() {\r\n console.log('stop animation...');\r\n}\r\nfunction pause() {\r\n console.log('pause animation...');\r\n}\r\nfunction resume() {\r\n console.log('resume animation...');\r\n}\r\nexport default { start, stop, pause, resume, sysInitTime };\r\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nmodule.exports = isUndefined;\n","/**\r\n * 一组缓动工具函数\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nconst Easing = {\r\n /**\r\n * 线性变化\r\n * @param from 起始值\r\n * @param to 终止值\r\n * @param duration 持续时间,ms\r\n * @param startTime 动画开始时间\r\n */\r\n linear: function (from, to, duration, startTime) {\r\n let deltaT = Date.now() - startTime;\r\n let deltaValue = to - from;\r\n return from + (deltaValue / duration) * deltaT;\r\n },\r\n easeInQuad: function (from, to, duration, startTime) {\r\n let deltaT = Date.now() - startTime;\r\n let deltaValue = to - from;\r\n return from + (deltaValue / duration) * (deltaT / duration) * deltaT;\r\n },\r\n};\r\nexport default Easing;\r\n","import isString from 'lodash/isString';\r\nimport isUndefined from 'lodash/isUndefined';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\nimport { EventBus } from './../event/EventBus';\r\nimport Easing from './Easing';\r\n/**\r\n * TODO:singleton???\r\n * @class AnimationManager\r\n * 全局动画管理器\r\n * @singleton\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass AnimationManager {\r\n constructor() {\r\n this.animationMap = new Map(); //所有需要执行动画的元素都会被自动存入此列表中\r\n }\r\n start() {\r\n EventBus.on(ICE_CONSTS.ICE_FRAME_EVENT, (evt) => {\r\n this.animationMap.forEach((el) => {\r\n this.tween(el);\r\n });\r\n });\r\n return this;\r\n }\r\n //FIXME:\r\n stop() { }\r\n //TODO:处理无限循环播放的情况,处理播放次数的情况\r\n //TODO:每一个属性变化的持续时间不同,需要做同步处理,所有动画都执行完毕之后,需要把对象从动画列表中删除\r\n tween(el) {\r\n let newState = {};\r\n let animations = el.props.animations;\r\n for (let key in animations) {\r\n let animation = animations[key];\r\n let from = animation.from;\r\n let to = animation.to;\r\n let duration = animation.duration;\r\n if (isUndefined(animation.startTime)) {\r\n animation.startTime = Date.now();\r\n }\r\n if (isUndefined(animation.easing)) {\r\n animation.easing = 'linear';\r\n }\r\n let newValue = Easing[animation.easing](from, to, duration, animation.startTime);\r\n if (newValue > to) {\r\n newValue = to;\r\n }\r\n newState[key] = Math.floor(newValue); //使用整数个像素点\r\n }\r\n el.setState({ ...newState });\r\n return el;\r\n }\r\n add(component) {\r\n this.animationMap.set(component.id, component);\r\n }\r\n remove(el) {\r\n if (isString(el)) {\r\n this.animationMap.delete(el);\r\n }\r\n else {\r\n this.animationMap.delete(el.id);\r\n }\r\n }\r\n}\r\nexport default AnimationManager;\r\n","import ICE_CONSTS from '../ICE_CONSTS';\r\nimport { EventBus } from './EventBus';\r\n/**\r\n * TODO:singleton???\r\n * 事件转发器\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass EventDispatcher {\r\n constructor(ICE) {\r\n this.ICE = ICE;\r\n this.renderMap = ICE.renderMap;\r\n this.ctx = ICE.ctx;\r\n }\r\n start() {\r\n EventBus.on('click', (evt) => {\r\n this.findClickElement(evt);\r\n EventBus.trigger(ICE_CONSTS.CLICK_ITEM, evt);\r\n });\r\n return this;\r\n }\r\n /**\r\n * 找到被点击的对象,用代码触发 click 事件。\r\n * 在点击状态下,每次只能点击一个对象。\r\n * @param evt\r\n */\r\n findClickElement(evt) {\r\n let x = evt.clientX - this.ICE.canvasBoundingClientRect.left;\r\n let y = evt.clientY - this.ICE.canvasBoundingClientRect.top;\r\n let els = Array.from(this.renderMap.values());\r\n for (let i = 0; i < els.length; i++) {\r\n let el = els[i];\r\n if (el.path2D) {\r\n let flag1 = this.ctx.isPointInPath(el.path2D, x, y);\r\n let flag2 = this.ctx.isPointInStroke(el.path2D, x, y);\r\n if ((flag1 || flag2) && !el.silent) {\r\n evt.target = el;\r\n el.trigger('click', evt);\r\n return el;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\nexport default EventDispatcher;\r\n","import { EventBus } from '../event/EventBus';\r\nimport root from '../nodejs-support/root';\r\n\r\nconst mouseEvents = [\r\n 'click',\r\n 'dbclick',\r\n 'mousedown',\r\n 'mouseup',\r\n 'mousemove',\r\n 'mousemove',\r\n 'mouseenter',\r\n 'mouseleave',\r\n 'mouseout',\r\n 'mouseover',\r\n 'contextmenu',\r\n 'mousewheel',\r\n];\r\n\r\nif (root.addEventListener) {\r\n mouseEvents.forEach((item) => {\r\n //TODO:不同浏览器版本,以及 NodeJS 环境兼容性测试\r\n root.document.addEventListener(item, (evt) => {\r\n EventBus.trigger(evt.type, evt);\r\n });\r\n });\r\n}\r\n\r\nexport default mouseEvents;\r\n","import { EventBus } from '..';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\n/**\r\n * TODO:global singleton\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass CanvasRenderer {\r\n constructor(ICE) {\r\n this.ICE = ICE;\r\n this.renderMap = ICE.renderMap;\r\n this.ctx = ICE.ctx;\r\n }\r\n start() {\r\n console.log('Starting canvas renderer...');\r\n EventBus.on(ICE_CONSTS.ICE_FRAME_EVENT, (evt) => {\r\n //FIXME:fix this when using increamental rendering\r\n //FIXME:动画有闪烁\r\n this.ctx.clearRect(0, 0, this.ICE.canvasWidth, this.ICE.canvasHeight);\r\n if (this.renderMap && this.renderMap.size) {\r\n this.renderMap.forEach((el) => {\r\n !el.isRendering && el.render(this.ctx);\r\n });\r\n }\r\n });\r\n return this;\r\n }\r\n stop() {\r\n throw new Error('Method not implemented.');\r\n }\r\n}\r\nexport default CanvasRenderer;\r\n","/**\r\n * TODO:global singleton\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass SVGRenderer {\r\n constructor() { }\r\n start() {\r\n console.log('Starting SVG renderer...');\r\n }\r\n stop() {\r\n throw new Error('Method not implemented.');\r\n }\r\n}\r\nexport default SVGRenderer;\r\n","import { mat3 } from 'gl-matrix';\r\n/**\r\n * @class ICEBoundingRect 边界矩形\r\n *\r\n * 边界矩形总是绘制在全局坐标系中。\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMRect\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEBoundingRect {\r\n constructor(props = {}) {\r\n this.left = 0;\r\n this.top = 0;\r\n this.right = 0;\r\n this.bottom = 0;\r\n this.width = 0;\r\n this.height = 0;\r\n this.originalPoints = [];\r\n this.transformedPoints = [];\r\n let { top = 0, left = 0, width = 0, height = 0 } = props;\r\n this.top = top;\r\n this.left = left;\r\n this.width = width;\r\n this.height = height;\r\n this.right = left + width;\r\n this.bottom = top + height;\r\n //四点法,原始边界矩形的4个顶点\r\n this.originalPoints = [\r\n [this.left, this.top, 1],\r\n [this.left + this.width, this.top, 1],\r\n [this.left + this.width, this.top + this.height, 1],\r\n [this.left, this.top + this.height, 1],\r\n ];\r\n this.transformedPoints = [\r\n [this.left, this.top, 1],\r\n [this.left + this.width, this.top, 1],\r\n [this.left + this.width, this.top + this.height, 1],\r\n [this.left, this.top + this.height, 1],\r\n ];\r\n }\r\n /**\r\n * 边界矩形合并\r\n * @param target\r\n * @returns\r\n */\r\n union(target) {\r\n let { top, left, right, bottom, width, height } = this;\r\n top = target.top < top ? target.top : top;\r\n left = target.left < left ? target.left : left;\r\n bottom = target.bottom > bottom ? target.bottom : bottom;\r\n right = target.right > right ? target.right : right;\r\n width = right - left;\r\n height = bottom - top;\r\n return new ICEBoundingRect({ top, left, width, height });\r\n }\r\n transform(mat) {\r\n let result = [];\r\n for (let i = 0; i < this.originalPoints.length; i++) {\r\n result.push(mat3.mul([], mat, this.originalPoints[i]));\r\n }\r\n this.transformedPoints = result;\r\n return this;\r\n }\r\n}\r\nexport default ICEBoundingRect;\r\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","import { mat3 } from 'gl-matrix';\r\nimport get from 'lodash/get';\r\nimport EventTarget from '../event/EventTarget';\r\n/**\r\n * @class ICEComponent\r\n * Canvas 内部所有组件的根类\r\n * TODO:全部采用 Path2D 的方式绘制图形,不采用 CanvasRenderingContext2D 上定义的绘制图形的方法\r\n * TODO:定义图形对象的完整数据结构,包含path/style/animation/transformation\r\n * TODO:动画运行过程中不允许选中,不能进行交互\r\n * @abstract\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEComponent extends EventTarget {\r\n constructor(props = {}) {\r\n super(props);\r\n //FIXME:生成随机ID有问题,FIX\r\n //sha256(Math.random() * 100000000).toString();\r\n this.id = 'ICE_' + Math.floor(Math.random() * 10000000000);\r\n this.zIndex = 0;\r\n this.silent = false; //silent=true 将不会触发任何事件\r\n this.isRendering = false;\r\n //Default animations.\r\n this.animations = {};\r\n //Default transformations.\r\n this.transformations = {\r\n translate: [0, 0],\r\n scale: [1, 1],\r\n skew: [0, 0],\r\n rotate: 0,\r\n };\r\n //3阶单位矩阵,请勿修改此矩阵的值\r\n this.mat3Identity = [1, 0, 0, 0, 1, 0, 0, 0, 1];\r\n /**\r\n * Default props.\r\n * Do NOT modify props, use state for instead.\r\n * 在二维画布上,可视对象一定存在 x/y/width/height 这4个属性。\r\n */\r\n this.props = {\r\n left: 0,\r\n top: 0,\r\n animations: this.animations,\r\n transformations: this.transformations,\r\n transformationMatrix: [...this.mat3Identity],\r\n };\r\n this.state = { ...this.props };\r\n this.props = { ...this.props, ...props };\r\n this.state = { ...this.props };\r\n this.animations = this.props.animations;\r\n this.transformations = this.props.transformations;\r\n // this.id = 'ICE_' + sha256(Math.random() * 100000000).toString();\r\n this.zIndex++; //TODO:fix zIndex\r\n }\r\n setState(newState) {\r\n this.state = { ...this.state, ...newState };\r\n }\r\n /**\r\n * @param ctx CanvasRenderingContext2D\r\n */\r\n applyStrokeStyle(ctx) {\r\n console.log('apply stroke style...');\r\n }\r\n /**\r\n * @param ctx CanvasRenderingContext2D\r\n */\r\n applyFillStyle(ctx) {\r\n console.log('apply fill style...');\r\n }\r\n /**\r\n * 复合变换矩阵\r\n * 矩阵变换顺序:错切->旋转->缩放->平移\r\n */\r\n composeMatrix() {\r\n //skew\r\n let skewMat = [...this.mat3Identity];\r\n if (get(this, 'transformations.skew')) {\r\n skewMat[3] = get(this, 'transformations.skew.0');\r\n skewMat[1] = get(this, 'transformations.skew.1');\r\n }\r\n //rotate\r\n let rotateMat = [...this.mat3Identity];\r\n if (get(this, 'transformations.rotate')) {\r\n let angle = get(this, 'transformations.rotate');\r\n let radian = (angle * Math.PI) / 180;\r\n rotateMat[0] = Math.cos(radian);\r\n rotateMat[1] = Math.sin(radian);\r\n rotateMat[3] = -Math.sin(radian);\r\n rotateMat[4] = Math.cos(radian);\r\n }\r\n //scale\r\n let scaleMat = [...this.mat3Identity];\r\n if (get(this, 'transformations.scale')) {\r\n scaleMat[0] = get(this, 'transformations.scale.0');\r\n scaleMat[4] = get(this, 'transformations.scale.1');\r\n }\r\n //translate [[1,0,0][0,1,0][dx,dy,1]]\r\n let translateMat = [...this.mat3Identity];\r\n translateMat[6] = this.state.left;\r\n translateMat[7] = this.state.top;\r\n if (get(this, 'transformations.translate')) {\r\n translateMat[6] += get(this, 'transformations.translate.0');\r\n translateMat[7] += get(this, 'transformations.translate.1');\r\n }\r\n //依次左乘\r\n let result = mat3.mul([], rotateMat, skewMat);\r\n result = mat3.mul([], scaleMat, result);\r\n result = mat3.mul([], translateMat, result);\r\n //缓存当前的变换矩阵\r\n this.state.transformationMatrix = [...result];\r\n return result;\r\n }\r\n /**\r\n * TODO:改成 abstract?\r\n * @returns\r\n */\r\n toJSON() {\r\n return '{}';\r\n }\r\n /**\r\n * TODO:改成 abstract\r\n * @returns\r\n */\r\n fromJSON(jsonStr) {\r\n return {};\r\n }\r\n}\r\nexport default ICEComponent;\r\n","import { mat3 } from 'gl-matrix';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\nimport ICEBoundingRect from './ICEBoundingRect';\r\nimport ICEComponent from './ICEComponent';\r\n/**\r\n * @class ICEPath\r\n * 路径由一系列点构成。\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEPath extends ICEComponent {\r\n constructor(props = {}) {\r\n super(props);\r\n this.dots = [];\r\n this.path2D = new Path2D();\r\n this.dots = this.props.dots ? this.props.dots : [];\r\n this.state = { ...this.state, dots: this.dots };\r\n }\r\n /**\r\n * @overwrite\r\n * @param newState\r\n */\r\n setState(newState) {\r\n super.setState(newState);\r\n this.dots = [...this.state.dots];\r\n }\r\n /**\r\n * @param ctx CanvasRenderingContext2D\r\n */\r\n render(ctx) {\r\n this.isRendering = true;\r\n this.trigger(ICE_CONSTS.BEFORE_RENDER);\r\n ctx.strokeStyle = '';\r\n ctx.fillStyle = 'red';\r\n ctx.beginPath();\r\n this.createPath();\r\n ctx.stroke(this.path2D);\r\n ctx.fill(this.path2D);\r\n ctx.restore();\r\n this.trigger(ICE_CONSTS.AFTER_RENDER);\r\n this.isRendering = false;\r\n }\r\n createPath() {\r\n this.calcDots();\r\n this.applyTransform();\r\n this.doCreatePath();\r\n return this.path2D;\r\n }\r\n /**\r\n * 全部相对于 [0,0] 点,在 [0,0] 点计算完成之后再用变换矩阵左乘\r\n * @returns\r\n */\r\n calcDots() {\r\n return this.state.dots;\r\n }\r\n doCreatePath() {\r\n this.path2D = new Path2D();\r\n for (let i = 0; i < this.state.dots.length; i++) {\r\n const vertex = this.state.dots[i];\r\n if (i === 0) {\r\n this.path2D.moveTo(vertex.x, vertex.y);\r\n }\r\n else {\r\n this.path2D.lineTo(vertex.x, vertex.y);\r\n }\r\n }\r\n this.path2D.closePath();\r\n return this.path2D;\r\n }\r\n applyTransform() {\r\n let matrix = this.composeMatrix();\r\n this.state.dots.forEach((v) => {\r\n let transformed = mat3.mul([], matrix, [v.x, v.y, 1, 0, 0, 0, 0, 0, 0]);\r\n v.x = Math.floor(transformed[0]); //像素点使用整数\r\n v.y = Math.floor(transformed[1]); //像素点使用整数\r\n });\r\n }\r\n getCurrentBoundingRect() {\r\n let minX = 0;\r\n let minY = 0;\r\n let maxX = 0;\r\n let maxY = 0;\r\n for (let i = 0; i < this.state.dots.length; i++) {\r\n let v = this.state.dots[i];\r\n if (i === 0) {\r\n minX = v.x;\r\n maxX = v.x;\r\n minY = v.y;\r\n maxY = v.y;\r\n }\r\n else {\r\n if (v.x < minX) {\r\n minX = v.x;\r\n }\r\n if (v.x > maxX) {\r\n maxX = v.x;\r\n }\r\n if (v.y < minY) {\r\n minY = v.y;\r\n }\r\n if (v.y > maxY) {\r\n maxY = v.y;\r\n }\r\n }\r\n }\r\n return new ICEBoundingRect({ left: minX, top: minY, width: Math.floor(maxX - minX), height: Math.floor(maxY - minY) });\r\n }\r\n getTransformedBoundingRect() {\r\n const temp = new ICEBoundingRect({ left: 0, top: 0, width: this.state.width, height: this.state.height }); //width, height 可能会因为动画效果发生变化\r\n const mat = this.state.transformationMatrix;\r\n return temp.transform(mat);\r\n }\r\n}\r\nexport default ICEPath;\r\n","/**\r\n * 二维向量,笛卡尔坐标系。\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICEVector {\r\n constructor(v = { x: 0, y: 0 }) {\r\n this.x = 0;\r\n this.y = 0;\r\n this.x = v.x;\r\n this.y = v.y;\r\n }\r\n /**\r\n * 向量相加,生成新的向量对象。\r\n * @param v\r\n * @returns\r\n */\r\n add(v) {\r\n let newVector = new ICEVector();\r\n newVector.x = this.x + v.x;\r\n newVector.y = this.y + v.y;\r\n return newVector;\r\n }\r\n /**\r\n * 向量相减,生成新的向量。\r\n * @param v\r\n * @returns\r\n */\r\n sub(v) {\r\n let newVector = new ICEVector();\r\n newVector.x = this.x - v.x;\r\n newVector.y = this.y - v.y;\r\n return newVector;\r\n }\r\n mul(v) {\r\n //TODO:实现向量叉乘\r\n return this;\r\n }\r\n dot(v) {\r\n //TODO:实现向量点乘\r\n return this;\r\n }\r\n}\r\nexport default ICEVector;\r\n","import ICEPath from '../ICEPath';\r\nimport ICEVector from '../ICEVector';\r\n/**\r\n * @class ICERect 矩形\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass ICERect extends ICEPath {\r\n constructor(props = { width: 10, height: 10 }) {\r\n super(props);\r\n }\r\n calcDots() {\r\n let point1 = new ICEVector({ x: 0, y: 0 });\r\n let point2 = new ICEVector({ x: this.state.width, y: 0 });\r\n let point3 = new ICEVector({ x: this.state.width, y: this.state.height });\r\n let point4 = new ICEVector({ x: 0, y: this.state.height });\r\n this.dots = [point1, point2, point3, point4];\r\n return this.dots;\r\n }\r\n}\r\nexport default ICERect;\r\n","import { EventBus } from '../event/EventBus';\r\nimport ICEPath from '../graphic/ICEPath';\r\nimport ICEVector from '../graphic/ICEVector';\r\nimport ICERect from '../graphic/shape/ICERect';\r\nimport ICE_CONSTS from '../ICE_CONSTS';\r\n/**\r\n * TODO:\r\n * 单选模式下,BoundingRect 跟随对象的 TransformationMatrix\r\n * 多选模式下, BoundingRect永远不变换。\r\n * @see http://fabricjs.com/bounding-rectangle\r\n * @class TransformationHandle 可视化的变换手柄\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass TransformationHandle {\r\n constructor(ICE) {\r\n this.selectionList = [];\r\n this.ICE = ICE;\r\n this.selectionRect = new ICERect({\r\n left: 0,\r\n top: 0,\r\n width: 10,\r\n height: 10,\r\n });\r\n this.ICE.addToRenderMap(this.selectionRect);\r\n this.selectionPath = new ICEPath();\r\n this.ICE.addToRenderMap(this.selectionPath);\r\n }\r\n start() {\r\n EventBus.on(ICE_CONSTS.CLICK_ITEM, (evt) => {\r\n if (evt.ctrlKey) {\r\n this.selectionList.push(evt.target);\r\n }\r\n else {\r\n this.selectionList = [evt.target];\r\n }\r\n this.drawSelectionRect();\r\n });\r\n return this;\r\n }\r\n drawSelectionRect() {\r\n let minX = 0;\r\n let minY = 0;\r\n let maxX = 0;\r\n let maxY = 0;\r\n for (let i = 0; i < this.selectionList.length; i++) {\r\n let boundingRect = this.selectionList[i].getCurrentBoundingRect();\r\n console.log(boundingRect);\r\n if (i === 0) {\r\n minX = boundingRect.left;\r\n minY = boundingRect.top;\r\n maxX = boundingRect.right;\r\n maxY = boundingRect.bottom;\r\n }\r\n else {\r\n if (boundingRect.left < minX) {\r\n minX = boundingRect.left;\r\n }\r\n if (boundingRect.top < minY) {\r\n minY = boundingRect.top;\r\n }\r\n if (boundingRect.right > maxX) {\r\n maxX = boundingRect.right;\r\n }\r\n if (boundingRect.bottom > maxY) {\r\n maxY = boundingRect.bottom;\r\n }\r\n }\r\n //变换之后的边界矩形\r\n console.log(this.selectionList[i].getTransformedBoundingRect());\r\n let transformedPoints = this.selectionList[i].getTransformedBoundingRect().transformedPoints;\r\n let dots = [];\r\n for (let j = 0; j < transformedPoints.length; j++) {\r\n const p = transformedPoints[j];\r\n dots.push(new ICEVector({ x: p[0] - 10, y: p[1] - 10 })); //FIXME: -10 for test\r\n }\r\n this.selectionPath.setState({ dots: dots });\r\n }\r\n this.selectionRect.setState({\r\n left: minX,\r\n top: minY,\r\n width: maxX - minX,\r\n height: maxY - minY,\r\n });\r\n }\r\n //FIXME:\r\n stop() { }\r\n}\r\nexport default TransformationHandle;\r\n","import isString from 'lodash/isString';\r\nimport pkg from '../package.json';\r\nimport AnimationManager from './animation/AnimationManager';\r\nimport EventDispatcher from './event/EventDispatcher';\r\nimport EventTarget from './event/EventTarget';\r\nimport './event/keyboard-event-interceptor.js';\r\nimport './event/mouse-event-interceptor.js';\r\nimport './event/touch-event-interceptor.js';\r\nimport CanvasRenderer from './renderer/CanvasRenderer';\r\nimport SVGRenderer from './renderer/SVGRenderer';\r\nimport TransformationHandle from './transformation/TransformationHandle';\r\nconst renderer = {\r\n ICE_CANVAS_RENDERER: CanvasRenderer,\r\n ICE_SVG_RENDERER: SVGRenderer,\r\n};\r\n/**\r\n * ICE: interactive canvas engine.\r\n * 全局单例\r\n * @author 大漠穷秋<damoqiongqiu@126.com>\r\n */\r\nclass _ICE extends EventTarget {\r\n constructor(props = {}) {\r\n super();\r\n this.version = pkg.version;\r\n //所有需要在 canvas 中渲染的对象都在此结构中 TODO:为了支持 zIndex 特性,需要改成数组,有堆叠顺序\r\n this.renderMap = new Map();\r\n this.canvasWidth = 0;\r\n this.canvasHeight = 0;\r\n }\r\n /**\r\n * @param ctx DOM id or CanvasContext\r\n */\r\n init(ctx) {\r\n if (!ctx) {\r\n throw new Error('init() failed...');\r\n }\r\n if (this.ctx === ctx) {\r\n //FIXME:\r\n throw new Error('同一个 canvas 实例只能 init 一次...');\r\n }\r\n //FIXME:防止 init 方法被调用多次\r\n if (isString(ctx)) {\r\n this.canvasEl = this.root.document.getElementById(ctx);\r\n this.canvasWidth = this.canvasEl.width;\r\n this.canvasHeight = this.canvasEl.height;\r\n this.canvasBoundingClientRect = this.canvasEl.getBoundingClientRect();\r\n this.ctx = this.canvasEl.getContext('2d');\r\n }\r\n else {\r\n this.ctx = ctx;\r\n }\r\n //Create a set of Managers.\r\n this.eventDispatcher = new EventDispatcher(this).start();\r\n this.animationManager = new AnimationManager().start();\r\n this.currentRenderer = new CanvasRenderer(this).start();\r\n this.transformationHandle = new TransformationHandle(this).start();\r\n }\r\n registerRenderer(name, rendererClass) {\r\n renderer[name] = rendererClass;\r\n }\r\n setRenderer(name) {\r\n this.currentRenderer = renderer[name];\r\n }\r\n addToRenderMap(component) {\r\n this.renderMap.set(component.id, component);\r\n if (component.props.animations) {\r\n this.animationManager.add(component);\r\n }\r\n }\r\n removeFromRenderMap(obj) {\r\n //TODO:停止动画效果\r\n //TODO:停止变换\r\n //TODO:清理所有事件监听,然后再从结构中删除\r\n }\r\n clearRenderMap() {\r\n //TODO:停止所有对象的动画效果\r\n //TODO:停止变换\r\n //TODO:清理所有事件监听,然后再从结构中删除\r\n }\r\n toJSON() {\r\n return '{}';\r\n }\r\n fromJSON(jsonStr) {\r\n return {};\r\n }\r\n}\r\nexport const ICE = new _ICE();\r\n","import FrameController from './animation/FrameManager';\r\nimport { ICE } from './ICE';\r\nimport root from './nodejs-support/root';\r\nroot.ICE = ICE;\r\nICE.root = root;\r\nFrameController.start();\r\nexport * from './event/EventBus';\r\nexport * from './graphic/ICEBoundingRect';\r\nexport * from './graphic/ICEComponent';\r\nexport * from './graphic/ICEImage';\r\nexport * from './graphic/ICEText';\r\nexport * from './graphic/line/ICEBezier';\r\nexport * from './graphic/line/ICELine';\r\nexport * from './graphic/shape/ICEIsogon';\r\nexport * from './graphic/shape/ICERect';\r\nexport * from './graphic/shape/ICEStar';\r\nexport default { root, ICE };\r\n"],"names":["ICEEvent","evt","p","EventTarget","props","listeners","suspendedEventNames","eventName","fn","this","includes","push","splice","findIndex","on","_this","off","apply","originalEvent","iceEvent","type","timeStamp","Date","getTime","forEach","cb","prototype","suspended","addEventListener","removeEventListener","dispatchEvent","trigger","EventBus","ICE_CONSTS","root","window","global","frameCallback","requestAnimationFrame","start","stop","console","log","pause","resume","sysInitTime","now","Object","freeSelf","self","freeGlobal","Function","Symbol","objectProto","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","value","isOwn","call","tag","unmasked","e","result","getRawTag","objectToString","Array","isArray","isObjectLike","baseGetTag","Easing","linear","from","to","duration","startTime","easeInQuad","deltaT","AnimationManager","animationMap","Map","el","tween","newState","animations","key","animation","isUndefined","easing","newValue","Math","floor","setState","component","set","id","isString","EventDispatcher","ICE","renderMap","ctx","findClickElement","x","clientX","canvasBoundingClientRect","left","y","clientY","top","els","values","i","length","path2D","flag1","isPointInPath","flag2","isPointInStroke","silent","target","item","document","CanvasRenderer","clearRect","canvasWidth","canvasHeight","size","isRendering","render","Error","SVGRenderer","ICEBoundingRect","right","bottom","width","height","originalPoints","transformedPoints","mat","mat3","mul","reIsDeepProp","reIsPlainProp","object","isSymbol","test","uid","isObject","maskSrcKey","exec","coreJsData","keys","IE_PROTO","func","funcToString","reIsHostCtor","funcProto","reIsNative","RegExp","replace","isMasked","isFunction","toSource","getValue","baseIsNative","getNative","__data__","nativeCreate","has","data","Hash","entries","index","clear","entry","hashClear","hashDelete","get","hashGet","hashHas","hashSet","other","array","eq","assocIndexOf","pop","ListCache","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","hash","map","string","isKeyable","getMapData","MapCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","memoize","resolver","TypeError","memoized","args","arguments","cache","Cache","rePropName","reEscapeChar","memoizeCapped","charCodeAt","match","number","quote","subString","iteratee","symbolProto","symbolToString","baseToString","arrayMap","isKey","stringToPath","path","castPath","toKey","defaultValue","baseGet","ICEComponent","random","zIndex","transformations","translate","scale","skew","rotate","mat3Identity","transformationMatrix","state","skewMat","rotateMat","radian","PI","cos","sin","scaleMat","translateMat","jsonStr","ICEPath","dots","Path2D","strokeStyle","fillStyle","beginPath","createPath","stroke","fill","restore","calcDots","applyTransform","doCreatePath","vertex","moveTo","lineTo","closePath","matrix","composeMatrix","v","transformed","minX","minY","maxX","maxY","temp","transform","ICEVector","newVector","ICERect","point1","point2","point3","point4","TransformationHandle","selectionList","selectionRect","addToRenderMap","selectionPath","ctrlKey","drawSelectionRect","boundingRect","getCurrentBoundingRect","getTransformedBoundingRect","j","renderer","ICE_CANVAS_RENDERER","ICE_SVG_RENDERER","version","pkg","canvasEl","getElementById","getBoundingClientRect","getContext","eventDispatcher","animationManager","currentRenderer","transformationHandle","name","rendererClass","add","obj","FrameController"],"mappings":"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"}